【问题标题】: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.prototype 是F 的一个实例。我们将constructor 属性分配给该实例,这将影响分配给F.prototype 的constructor 属性。那么,为什么要首先分配它呢?
一般来说,constructor 属性在 JavaScript 中没有意义,但它可能在您的自己的代码中很有用。 IE。您的代码可能取决于constructor 的正确值。但是在object 函数中,F 只是一个临时构造函数,object 只是复制了Object.create 的功能,这在较新的浏览器中是受支持的。我想不出你想在代码中引用F 的用例。