【问题标题】:Confused about Douglas Crockford's object function对 Douglas Crockford 的对象函数感到困惑
【发布时间】:2013-08-05 08:42:15
【问题描述】:

我知道 Crockford 有一个著名的 JavaScript 继承对象函数:

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

但我很困惑,在F.prototype = o这行之后,他为什么不重置F.prototype的构造函数,像这样:

F.prototype.constructor = F

这不是常见的做法吗?

【问题讨论】:

  • 你是在继承,而不是复制。

标签: javascript constructor prototype


【解决方案1】:

这不是常见的做法吗?

仅当您创建子类时(具有从其他原型继承的原型的构造函数)。

但这不是这段代码的目的,基本上是Object.create。它负责创建从另一个对象继承的对象,仅此而已。 F 构造函数只是中间的,不应该暴露。

F.prototype = o;

他为什么不做F.prototype.constructor = F

因为那会改变o 本身。目的只是创建一个新对象。请注意,它返回的是中间构造函数的 instance,而不是构造函数本身。


constructor 将设置在哪里 (if needed)?在 object 实例化的 new 对象上:

 function inherit(chd, par) {
     chd.prototype = object(par.prototype);
     chd.prototype.constructor = chd;
 }

 function Foo() {}
 function Bar() {}
 inherit(Foo, Bar);

 /* Because of overwriting `constructor`: */
 Foo.prototype.constructor === Foo
 (new Foo).constructor === Foo

 /* Because of the prototype chain: */
 new Foo instanceof Bar // true, because
 Foo.prototype instanceof Bar // true

【讨论】:

    【解决方案2】:

    由于您使用F 的实例作为原型对象本身,因此设置constructor 属性没有任何好处。

    例如:

    function Foo() {}
    function Bar() {}
    
    Bar.prototype = object(Foo.prototype);
    Bar.prototype.constructor = Bar;
    

    所以现在Bar.prototypeF 的一个实例。我们将constructor 属性分配给该实例,这将影响分配给F.prototypeconstructor 属性。那么,为什么要首先分配它呢?

    一般来说,constructor 属性在 JavaScript 中没有意义,但它可能在您的自己的代码中很有用。 IE。您的代码可能取决于constructor 的正确值。但是在object 函数中,F 只是一个临时构造函数,object 只是复制了Object.create 的功能,这在较新的浏览器中是受支持的。我想不出你想在代码中引用F 的用例。

    【讨论】:

    • 不要将Foo构造函数传递给object! :-)
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多