我知道Crockford在JavaScript中有一个着名的继承函数:
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
但我很困惑,在F.prototype = o
行之后,他为什么不重置F.prototype
的构造函数,如下所示:
F.prototype.constructor = F
这不常见吗?
答案 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.prototype
是F
的一个实例。我们将constructor
属性分配给该实例,该属性将隐藏分配给constructor
的{{1}}属性。那么为什么要先把它分配呢?
一般来说,F.prototype
属性在JavaScript中没有意义,但它可能在您的自己的代码中很有用。即您的代码可能取决于constructor
的正确值。但在constructor
函数中,object
只是一个临时构造函数,而F
只是复制Object.create
的功能,这在新版浏览器中是受支持的。我想不出您希望在代码中引用object
的用例。