裸 JavaScript 對象
我在瀏覽 Narcissus(用 JavaScript 編寫的 JavaScript 解釋器)的一個源文件時,遇到了我之前可能錯過的一行:
var keywords = {__proto__: null};
__proto__
屬性只能在 Firefox、Safari、Rhino 和 ActionScript 中訪問,並且是將對象實例與其原型聯繫起來的屬性。關於 JavaScript 的一個鮮為人知的事實是,對象實例與其構造函數無關,只與原型無關。 __proto__
屬性暴露了這種關係。
與大多數屬性一樣,__proto__
可以被覆蓋。這樣做會改變對象的原型鏈。 Narcisuss 的代碼有效地創建了一個沒有原型鏈的 JavaScript 對象,因此所有對像都沒有從 Object
繼承的方法 .結果?一個沒有任何屬性的真正裸露的基礎對象。切斷原型鏈也可以確保對 Object.prototype
的更改 不會影響 for-in
的使用 .這真的很有趣:
var o = { __proto__: null };<br />
alert(o.toString); //undefined
有趣的是,這似乎是創建裸對象的唯一方法。您可以定義一個原型設置為 null
的構造函數 ,但使用該構造函數創建實例會自動將原型重置為 Object
.示例:
function MyObject(){}<br />
MyObject.prototype = null;<br />
var o = new MyObject();<br />
alert(o.toString); //function
我不知道這些信息有什麼用處,但肯定很有趣。