簡體   English   中英

對道格拉斯·克羅克福德的對象函數感到困惑

[英]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.prototypeF的實例。 我們為該實例分配了constructor屬性,該實例將F.prototype分配給F.prototypeconstructor屬性。 那么,為什么要首先分配它呢?

一般來說, constructor屬性在JavaScript中沒有意義,但是在您自己的代碼中可能很有用。 即您的代碼可能取決於constructor的正確值。 但是在object函數中, F只是一個臨時構造函數,而object只是復制Object.create的功能,新的瀏覽器支持該功能。 我想不出一個用例,您想要在代碼中引用F

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM