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.
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.