2012-12-06 27 views
4

我找不到JS spec中的任何地方,其中功能 - 當用new調用時,應該將其原型的constructor屬性設置爲自己。不是spec中的構造函數的JavaScript prototype.constructor屬性?

確保規範說的內置構造函數(對象,數組,字符串,& c)所有設置其屬性prototype.constructor自己(即Object.prototype.constructor = Object),但我找不到任何地方,說這必須/應該發生的其他構造函數(似乎應該在[[Construct]]部分(13.2.2 [[Construct]]拼寫出來),但它不是:

function F() {}; 
var obj = new F(); 
Object.getPrototypeOf(obj).constructor == F; // non-standard?? I can't find where in spec 

我問,因爲我看到很多代碼「復位」構造的prototype.constructor財產'返回'本身 - 但這似乎是非標準的,這個屬性指出了構造函數的第一位?

function F() {}; 
F.prototype = new Parent(); 
F.prototype.constructor = F; // 'reset' it cuz it changed! (according to spec it should never have been set? Except in Object.prototype. 

能/應該JS程序員依靠這種非標準(?)期望構造的prototype.constructor屬性將重新指向構造函數本身如果原型屬性沒有設置?

V8肯定不會這樣的:

function F() {}; 
console.log(F.prototype.constructor === F); // true! WHY??? not in spec? Should be Object? 

。希望取得隱隱約約地感覺到 - 謝謝! Mark

PS由於它們的可變性,我只能依靠instanceof而不是使用constructor屬性。

+0

我認爲最好的做法是產品總數開溝構造和使用的Object.create和.isPrototypeOf。 – Alex

+0

你說得對,'[[construct]]'('new'關鍵字)不會設置構造函數屬性。相反,它是從使用該函數創建的默認原型對象繼承的,請參見[section 13.2](http://es5.github.com/#x13.2) – Bergi

+0

dun thanks〜!!!不知道我怎麼錯過了...... – user1883202

回答

4

所有功能的標準配置爲.prototype屬性指向具有指向該函數的.constructor屬性的對象。

13.2 Creating Function objects

1)創建一個新的原生ECMAScript的對象,讓F是對象。

...

16)設原是創建一個新的對象將由表達new Object()其中對象是內置構造器名標準建設的結果。

17)調用[[DefineOwnProperty]] proto的內部方法,參數"constructor",屬性描述符{[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}和false。

18)調用[[DefineOwnProperty]]內部方法F,參數"prototype",屬性描述符{[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}和false。

所以你可以看到F是新功能,proto是原型對象。該proto得到一個"constructor"屬性指向F,並F得到一個"prototype"屬性指向proto對象

+0

啊謝謝!不知道我怎麼錯過了那個DUH! – user1883202

+0

@ user1883202:不客氣,僅供參考,我在我的答案中修正了第一句話,這個答案很糟糕。 –

相關問題