对Douglas Crockford的对象功能感到困惑

时间:2013-08-05 08:42:15

标签: javascript constructor prototype

我知道Crockford在JavaScript中有一个着名的继承函数:

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

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

F.prototype.constructor = F

这不常见吗?

2 个答案:

答案 0 :(得分:1)

  

这不常见吗?

只有在你创建子类时(构造函数的原型继承自其他原型)。

但这不是这段代码的目的,基本上是Object.create。它需要创建从另一个对象继承的对象,而不是其他任何东西。 F构造函数只是中间函数,不应该公开。

F.prototype = o;
     

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

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


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

答案 1 :(得分:0)

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

例如:

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

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

所以现在Bar.prototypeF的一个实例。我们将constructor属性分配给该实例,该属性将隐藏分配给constructor的{​​{1}}属性。那么为什么要先把它分配呢?

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