繁体   English   中英

对道格拉斯·克罗克福德的对象函数感到困惑

[英]Confused about Douglas Crockford's object function

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

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

但是我很困惑,在F.prototype = o行之后,为什么他不重置F.prototype的构造函数,如下所示:

F.prototype.constructor = F

这不是惯例吗?

这不是惯例吗?

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

但这不是此代码的目的,基本上是Object.create 它涉及创建从另一个对象继承的对象的过程,仅此而已。 F构造函数仅在中间,不应公开。

 F.prototype = o; 

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

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


将在哪里设置constructor如果需要 )? 在由object实例化的对象上:

 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

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

例如:

function Foo() {}
function Bar() {}

Bar.prototype = object(Foo.prototype);
Bar.prototype.constructor = Bar;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM