before javascript getter-setter defineproperty

javascript - before - Object.defineProperty para todos los navegadores?



before javascript (3)

He tenido esta misma pregunta yo mismo. (Consulte aquí). No parece que sea completamente posible en IE8 o inferior. De lo contrario el es5-shim es tu mejor apuesta.

Preguntando sobre Object.defineProperty como se muestra a continuación:

function testComponent(){ var testProperty; Object.defineProperty(this, "testProperty", { get : function() { return testProperty; }, set : function(val) { testProperty = val; } }); }

Donde se usaría como tal:

testObject = new testComponent(); testObject.testProperty = "testValue";

Según lo que he visto hasta ahora, parece que no hay una solución de navegador cruzado, ya que he intentado usar es5-shim sin suerte, pero me gustaría confirmarlo. También encontré una referencia a esta publicación y mis pruebas aún fallan en IE 7 y 8, ¿alguien puede arrojar alguna luz sobre esto?

Recuerdo haber mirado una pregunta relacionada hace unos meses en algún lugar de S / O y creo que vi que alguien había escrito una solución para esto en una respuesta. Cualquier solución general para los getters / setters también sería apreciada. La idea es que necesito algún equivalente de un setter getter en un objeto sin pasar el cambio de parámetro a través de un método. No necesito IE6, pero me gustaría admitir navegadores en el rango de IE7 + ff 3.6+, etc.

QUnit pruebas a continuación: ( jsFiddles )

(Estos pasan en todos los navegadores en mi máquina, excepto IE 7 y 8

Uso directo de defineProperty, sin shims :
http://jsfiddle.net/uSYFE/

violín usando el calzo ES5, ¿asumo que todo lo que necesito hacer es incluirlo? :
http://jsfiddle.net/hyperthalamus/ntwDy/

jugar con la solución recomendada por IE :
http://jsfiddle.net/hyperthalamus/xfvz3/


Para los IEs anteriores, debería asegurarse de que su propiedad sea un objeto dom (incluso una etiqueta falsa) y usar onPropertyChange para recibir una notificación. Ver este post por John Dyer para más detalles.


Según es5-shim :

/! / Object.defineProperty

Este método fallará silenciosamente para establecer las propiedades de "escritura", "enumerable" y "configurable".

Proporcionar a un getter o setter un "get" o "set" en un descriptor fallará silenciosamente en motores que carecen de "defineGetter" y "defineSetter", que incluyen todas las versiones de IE hasta la versión 8 hasta el momento.

IE 8 proporciona una versión de este método pero solo funciona en objetos DOM. Por lo tanto, el shim no se instalará y los intentos de establecer las propiedades de "valor" fallarán silenciosamente en objetos que no sean DOM.

https://github.com/kriskowal/es5-shim/issues#issue/5

Así que ya sabes tu respuesta. Se puede hacer en elementos DOM, eso es todo (y solo en IE8).

Le sugiero que utilice los métodos get / set si desea que IE7 funcione.