2011-12-07 58 views
5

有沒有可能改變IE9或IE10中對象的__proto__屬性? 或者MS仍然沒有計劃將它包含在他們的JS引擎中?__proto__ for IE9 or IE10

我需要它在一個非常特殊的情況下,我需要更改__proto__對象被創建。

回答

12

__proto__是將在ES6中進行標準化。它目前在Appendix B of the ES6 draft這實際上意味着如果它被實現它需要有以下語義。

__proto__作爲Object.prototype上的訪問者都可用,這意味着默認情況下所有對象都可以讀寫它。但是,它可以從Object.prototype中刪除(使用delete)。一旦刪除__proto__將作爲一個正常的數據屬性,對設置沒有副作用。

__proto__也是對象文字中的一種特殊語法形式。即使Object.prototype.__proto__被刪除,它也會設置[[原型]]。

 
var p = {a: 1}; 
var o = { 
    __proto__: p, 
    b: 2 
} 

ES6還介紹了Object.setPrototypeOf(不在附錄中)。這比設置__proto__更受歡迎。

__proto__適用於所有現代瀏覽器,including Internet Explorer 11

+0

我希望這是真的。你知道ES6是否允許從Array有效地派生? –

+0

__proto__不在標準軌道上 - 而是ES6批准的Object.setPrototypeOf以獲得更好的支持https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto –

+0

是的ES6將支持建立在像Array這樣的本地類中的子類。 –

0

我不確定究竟是什麼,因爲您的問題沒有指定,但對於proto的大多數用途,您應該能夠使用prototype

var foo = new Bar(); 
//this also affects foo 
Bar.prototype.baz = something; 
+0

我didn't指定的,因爲我想知道的唯一的事情是,如果IE9/10支持修改__proto__屬性,因爲it'是目前唯一不支持的瀏覽器。 –

+0

我不明白「新酒吧();」。你如何使用Object.create來重寫? –

1

一個nonanswer作爲最後嘗試的手段:

更改您的代碼,以便將原本通過改變原型進行訪問的所有屬性都通過明確的代表團在一個正常的屬性現在訪問:

{ 
    a: 17, 
    __proto__: { ... } 
} 

{ 
    a: 17, 
    proto: {...} 
}