2011-12-07 9 views
5

¿Hay alguna posibilidad de cambiar la propiedad __proto__ de un objeto en IE9 o IE10? ¿O la MS todavía no planea incluirlo en su motor JS?__proto__ para IE9 o IE10

Lo necesito en una situación muy especial donde necesito cambiar __proto__después de se crea el objeto.

Respuesta

12

__proto__ es va a ser estandarizado en ES6. Actualmente se encuentra en Appendix B of the ES6 draft lo que en la práctica significa que, si se implementa, debe tener la siguiente semántica.

__proto__ está disponible como un descriptor de acceso en Object.prototype, lo que significa que todos los objetos pueden leerlo y escribirlo de forma predeterminada. Sin embargo, se puede eliminar de Object.prototype (usando delete). Una vez eliminado __proto__ funcionará como una propiedad de datos normal sin efectos secundarios en la configuración.

__proto__ es también una forma sintáctica especial en literales de objeto. Trabajará para configurar el [[Prototype]] incluso si se eliminó Object.prototype.__proto__.

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

ES6 también introduce Object.setPrototypeOf (no en el apéndice). Esto es preferible a la configuración __proto__.

__proto__ está disponible en todos los navegadores modernos, including Internet Explorer 11.

+0

Espero que esto sea cierto. ¿Sabes si ES6 permitirá derivar eficientemente de Array? –

+0

__proto__ no está en una pista de estándares; en su lugar, Object.setPrototypeOf aprobado por ES6 para una mejor compatibilidad https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto –

+0

Sí ES6 será compatible subclases integradas en clases nativas como Array. –

0

No estoy seguro de qué es exactamente lo que está buscando ya que su pregunta no especificaba, pero para la mayoría de los usos de proto, debería poder usar prototype.

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

Google No especifico, porque lo único que quiero saber es si IE9/10 soporta la modificación de la propiedad __proto__, ya it' s el único navegador que no lo admite en este momento. –

+0

No entiendo "new Bar();". ¿Cómo puedes reescribir esto usando Object.create? –

1

Un no-respuesta como último recurso caso:

cambiar su código de manera que todas las propiedades que se accede inicialmente a través del prototipo cambiado Ahora se accede a través de la delegación explícita sobre una propiedad de la normalidad:

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

a

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