![](/img/trans.png)
[英]'method' on Function.prototype in Douglas Crockford's book
[英]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.prototype
是F
的实例。 我们为该实例分配了constructor
属性,该实例将F.prototype
分配给F.prototype
的constructor
属性。 那么,为什么要首先分配它呢?
一般来说, constructor
属性在JavaScript中没有意义,但是在您自己的代码中可能很有用。 即您的代码可能取决于constructor
的正确值。 但是在object
函数中, F
只是一个临时构造函数,而object
只是复制Object.create
的功能,新的浏览器支持该功能。 我想不出一个用例,您想要在代码中引用F
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.