2011-12-07 2 views
5

Есть ли возможность изменить свойство объекта __proto__ объекта в IE9 или IE10? Или MS все еще не планирует включать его в свой JS-движок?__proto__ для IE9 или IE10

Мне нужно это в особой ситуации, когда мне нужно изменить __proto__после объект создан.

ответ

12

__proto__ является будет стандартизован в ES6. В настоящее время он находится в Appendix B of the ES6 draft, что на практике означает, что если он реализован, он должен иметь следующую семантику.

__proto__ оба доступны в качестве аксессуаров на Object.prototype, что означает, что все объекты могут читать и писать по умолчанию. Однако его можно удалить с Object.prototype (используя delete). После удаления __proto__ будет работать как нормальное свойство данных без каких-либо побочных эффектов при настройке.

__proto__ также является специальной синтаксической формой в объектных литералах. Он будет работать, чтобы установить [[Prototype]], даже если Object.prototype.__proto__ был удален.

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

ES6 также вводит Object.setPrototypeOf (не в приложении). Это предпочтительнее, чем установка __proto__.

__proto__ доступен во всех современных браузерах, including Internet Explorer 11.

+0

Надеюсь, это правда. Знаете ли вы, что ES6 позволит эффективно извлекать данные из массива? –

+0

__proto__ не находится на стандартном треке - вместо этого одобрен ES6 Object.setPrototypeOf для лучшей поддержки https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto –

+0

Да ES6 будет поддерживать subclassing, встроенный в родные классы, такие как Array. –

0

Я не уверен, что именно вы после этого, так как ваш вопрос не указал, но для большинства применений прото, вы должны иметь возможность использовать 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: {...} 
} 
Смежные вопросы