![](/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.