代码之家  ›  专栏  ›  技术社区  ›  John

克罗克福德书中的“方法”:Javascript:好的部分

  •  23
  • John  · 技术社区  · 15 年前

    道格拉斯·克罗克福德在他的书(第4页)中写道:

    在整本书中 method 方法用于定义新方法,这是它的定义:

    Function.prototype.method = function (name, func) {
        this.prototype[name] = func;
        return this;
    };
    

    然后他开始用这个 方法 Number, String, Function, Object, Array, RegExp ,以下是完整的列表

    第33页:

    Number.method('integer', function () {...});
    String.method('trim', function () {...});
    

    String.method('deentityify', function () {...}());
    

    第43页和第44页:

    Function.method('curry', function () {...});
    

    P47(我很困惑,不知道为什么克罗克福德定义 new 方法,他似乎从不使用 新的 书中的方法):

    Function.method('new', function () {...});
    

    第48页:

    Function.method('inherits', function (Parent) {...});
    

    第54页:

    Object.method('superior', function (name) {...});
    

    Array.method('reduce', function (f, value) {...});
    

    第79页:

    Array.method('pop', function () {...});
    Array.method('push', function () {...});
    Array.method('shift', function () {...});
    

    Array.method('splice', function (start, deleteCount) {...});
    

    P84页:

    Function.method('bind', function (that) {...});
    

    P88页:

    RegExp.method('test', function (string) {...});
    String.method('charAt', function (pos) {...});
    

    String.method('entityify', function () {...}());
    

    定义 基于 Function ,为什么它可以用于 Number, String, Object, Array, RegExp 功能 ? 这个可以吗 方法 是否习惯于其他数据类型?

    另一个小问题:在63&64页中,定义 Array.dim, Array.matrix, Array.identity 方法 ,为什么?

    5 回复  |  直到 15 年前
        1
  •  22
  •   Tim Down    15 年前

    JavaScript中的所有本机函数都继承自 Function.prototype . Number String , Object Array RegExp 都是函数,因此它们继承自 函数.原型 .

    method 方法 方法 ,他利用 this ,它是对调用该方法的对象的引用。 Array.dim Array.matrix Array.identity 因为它们独立于任何特定数组操作,因此不需要是单个数组对象的方法。它们被指定为 方便功能:它们可以像在全球范围内的功能一样独立存在。

        2
  •  4
  •   Jonathan    13 年前

    作为旁白,在第40页:

    end()表示“使用此函数返回的函数”,而不是返回它的外部函数。

    如果他省略了final(),那么对deentityify的调用将返回一个函数,而不是一个字符串。

    我们立即调用刚才生成的函数 使用()运算符。调用创建并返回函数 这就变成了去实体化的方法。

        3
  •  3
  •   Ouroboros    11 年前

    @Tim Down给出的解决方案是准确的,但并不完全清楚。

    首先,在javascript中,函数也是对象。从这里,我指的不是new()构造创建的对象,而是函数本身。为了避免混淆,我将这些对象称为 函数对象 ,对于使用函数的new()构造创建的对象 .

    任何 在javascript中有两个属性: _原型_ . 此外,任何 函数实例对象 (使用新构造函数创建)具有属性 _原型_ . 这个 _原型_ 是什么定义了继承。在这里可以找到一些很好的资源

    http://zeekat.nl/articles/constructors-considered-mildly-confusing.html

    如果objA和objC通过任意数量的 _原型_ . 所以如果objA有 等于objB,objB有 等于objC,则objA继承objB和objC,而objB继承objC。

    什么是遗产?

    使用 继承对象的任何属性。

    是谁的目标 _原型_ 每一个 指。这意味着 可以访问Function.prototype的属性,因为 函数对象 继承Function.prototype对象。这也意味着如果 属性被添加到Function.prototype对象,它将对所有可能的 函数对象

    这是指 函数对象 函数对象 函数对象

    有什么好处 原型 函数对象

    函数对象 原型 函数实例对象 使用该函数的新构造创建。


    Number.method('integer',function(){…});

    然后是Number.prototype 方法中定义的。这意味着每个数字 函数实例对象 例如,new Number(2.4),将从Number.prototype“继承”这个新属性“integer”,因为这个数字 函数实例对象 _原型_ 设置为Number.prototype。

        4
  •  0
  •   pczeus    8 年前

    尝试使用此原型方法:

    String.prototype.deentityify = function () { ... }
    

    然后:

    document.writeln('<">'.deentityify( ));
    

    我们可以看到: <">

        5
  •  0
  •   user890255    8 年前

    例句:如果有人卡住了,咖喱可以重写如下。见 jsFiddle demo

     Function.prototype.curry = function ( ) {
     var slice = Array.prototype.slice;
     var args = slice.apply(arguments);
     var that = this; 
     return function () {  
        return that.apply(null,args.concat (slice.apply(arguments)));
     }
    };
    var add = function(a, b)
    {
        return a + b;
    }
    var add1 = add.curry(1);
    document.writeln(add1(6)); // 7