【问题标题】:trying to understand javascript Function.prototype试图理解 javascript Function.prototype
【发布时间】:2011-06-21 02:54:18
【问题描述】:

我试图理解这段代码

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

函数体中的“this”指的是什么? 是指Function.prototype 吗? 是否试图添加成员 Function.prototype.prototype,即Function.prototype.prototype[name]

【问题讨论】:

    标签: javascript prototype-programming


    【解决方案1】:

    Function.prototype 中的函数在 Function 实例上调用。
    因此,this 指的是你调用它的函数。

    this.prototype 将引用您调用它的函数的原型。

    例如:

    function MyClass() { }
    MyClass.method("myMethod", function() { });
    
    var c = new MyClass();
    c.myMethod();    //MyClass.prototype.myMethod
    

    【讨论】:

    • 链接或尾调用并不总是一个好主意,因为它会使代码难以阅读和调试。
    【解决方案2】:

    “this”指的是您在赋值语句右侧创建的新函数。

    【讨论】:

      【解决方案3】:
      >     Function.prototype.method = function (name, fn) {
      >         this.prototype[name] = fn;
      >         return this;
      >     };
      

      这意味着函数从 Function.prototype 继承了一个 method 属性。例如

        function Foo(){}
        alert(typeof Foo.method); // function
      

      当调用 Foo.method() 时,在 方法 函数中,this 将引用 Foo,所以:

        Foo.method('sayHi', function(){alert('hi');});
      

      创建 Foo.prototypesayHi 属性,并为其分配所提供函数的值。注意 Foo 不继承 method 分配的函数,只继承 Foo 创建的对象(即 Foo的实例>) 有方法。

      注意事项

      函数的this 关键字是由调用设置的,因此如果您以其他方式调用方法,它可能会出现异常:

        var c = { method: Foo.method };
        alert(typeof c.method); // function
      
        c.method('sayHi', function(){alert('hi');}); // this.prototype is undefined
      

      【讨论】:

      • 那么,为什么 this.prototype 未定义(在注释中给出的最后一行代码中)?我知道即使对于使用文字创建的对象,原型也是 Object.prototype。所以这里的this.prototype应该是指Object.prototype。但显然,我明白你的观点,“this”的价值取决于调用者。如果我在考虑正确的路线,您能告诉我吗?
      • 分配给 c 的对象是一个没有公共 prototype 属性的普通对象(它只有一个公共属性 方法)。当以c.method() 调用时,this 引用 c,但 c 没有公共 prototype 属性,因此在方法this.prototype返回未定义。对于函数对象的默认公共 prototype 和用于继承的所有对象(包括函数、数组、日期等)的私有内部 [[Prototype]],经常会出现混淆。
      【解决方案4】:

      函数对象与函数实例对象

      首先,在javascript中,函数也是对象。由此,我的意思不是由 new () 构造创建的对象,而是函数本身。为避免混淆,我将此类对象称为 Function object,将使用函数的 new () 构造创建的对象称为 Function instance object

      _proto_和原型属性

      javascript中的任何函数对象都有两个属性:_proto_prototype。此外,任何函数实例对象(使用新构造函数创建)都有一个属性_proto_ _ proto _ 定义了继承。可以在

      找到一些很好的资源

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

      继承是如何定义的?

      如果objA和objC通过任意数量的_proto_连接,则一个对象objA继承另一个对象objC。所以如果objA的_proto_等于objB,objB的_proto_等于objC,那么objA继承objB和objC,而objB继承objC。

      什么是继承?

      这意味着任何继承对象都可以使用被继承对象的任何属性。

      什么是 Function.prototype

      是每个函数对象_proto_所引用的对象。这意味着每个 Function 对象 都可以访问 Function.prototype 的属性,因为每个 Function 对象 都继承了 Function.prototype 对象。这也意味着,如果 方法 属性被添加到 Function.prototype 对象中,它将可用于 javascript 中所有可能的 Function 对象。这包括字符串、数字等。

      this.prototype[name] = func;

      'this' 指的是 函数对象 ,当从 Function 对象 调用“方法”时,例如 Number、String 等。这意味着我们现在有了一个新的Function object 中名为“name”的属性,它是一个函数“func”。

      Function object

      prototype属性有什么用

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

      如果执行了以下操作:

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

      然后 Number.prototype 在其中定义了 integer 方法。这意味着每个 Number 函数实例对象,例如new Number (2.4),将从 Number.prototype 中“继承”这个新属性 'integer',因为 Number function instance object 将其 _ proto _ 设置为 Number .prototype。

      【讨论】:

        猜你喜欢
        • 2018-10-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        相关资源
        最近更新 更多