2011-12-07 11 views
5

Esiste la possibilità di modificare la proprietà __proto__ di un oggetto in IE9 o IE10? O la SM non ha ancora intenzione di includerla nel proprio motore JS?__proto__ per IE9 o IE10

ne ho bisogno in una situazione molto particolare in cui ho bisogno di cambiare __proto__dopo viene creato l'oggetto.

risposta

12

__proto__ è sarà standardizzato in ES6. È attualmente in Appendix B of the ES6 draft che in pratica significa che se è implementato deve avere la seguente semantica.

__proto__ è disponibile come accessorio su Object.prototype, il che significa che tutti gli oggetti possono leggerlo e scriverlo per impostazione predefinita. Tuttavia, può essere rimosso da Object.prototype (utilizzando delete). Una volta cancellato lo __proto__ funzionerà come una normale proprietà dei dati senza effetti collaterali sull'impostazione.

__proto__ è anche una forma sintattica speciale in oggetti letterali. Funzionerà per impostare [[Prototipo]] anche se è stato cancellato Object.prototype.__proto__.

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

ES6 introduce anche Object.setPrototypeOf (non in appendice). È preferibile impostare __proto__.

__proto__ è disponibile in tutti i browser moderni, including Internet Explorer 11.

+0

Spero che sia vero. Sai se ES6 permetterà di derivare in modo efficiente dalla matrice? –

+0

__proto__ non è su una traccia standard - invece ES6 ha approvato Object.setPrototypeOf per un supporto migliore https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto –

+0

Sì ES6 supporterà sottoclassi costruite in classi native come Array. –

0

Non sono sicuro di cosa si stia cercando esattamente dopo che la domanda non è stata specificata, ma per la maggior parte degli usi di proto, dovresti essere in grado di utilizzare prototype.

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

I hanno ragione't specificare, perché l'unica cosa che voglio sapere è se IE9/10 supporti modificando la proprietà __proto__, dal momento che it' s l'unico browser che non lo supporta al momento. –

+0

Non capisco "nuova barra();". Come puoi riscriverlo usando Object.create? –

1

Un nonanswer come un ultimo caso resort:

modificare il codice in modo che tutte le proprietà che sarebbe originariamente accessibili tramite il prototipo modificato sono ora accessibili tramite delega espressa nel corso di una proprietà normale:

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

a

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