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