2010-05-05 13 views
9

Un ejemplo simple usando un objeto javascript incorporado: navigator.my_new_property = "some value"; // ¿podemos detectar que esta nueva propiedad fue agregada?¿Detecta cuándo se agrega una nueva propiedad a un objeto Javascript?

No quiero sondear constantemente el objeto para comprobar si hay nuevas propiedades. ¿Hay algún tipo de establecedor de nivel superior para objetos en lugar de indicar explícitamente la propiedad para supervisar?

De nuevo, no quiero detectar si el valor de la propiedad cambió, sino más bien cuando se agrega una nueva propiedad.

Ideas? gracias

Respuesta

6

No. Los métodos existentes para determinar cuándo se escribe una propiedad en:

  • un ajustador de ECMAScript 5 definido usando defineProperty(obj, name, fn);
  • un setter de JavaScript heredado definido usando __defineSetter__(name, fn);
  • un legado Netscape/Mozilla watch(name, fn);

están basados ​​en nombres, por lo que no se puede capturar una propiedad nueva que se escribe con un nombre previamente desconocido. En cualquier caso, navigator puede ser un 'objeto host', por lo que no puede confiar en cualquiera de las interfaces normales de JavaScript Object que están disponibles en él.

El sondeo, o los métodos explícitos del instalador que proporcionan devolución de llamada, es todo lo que puede hacer.

situación similar: Getter/setter on javascript array?

+0

Gracias por la respuesta detallada. Si tomo la ruta de votación, ¿cuál consideraría un buen intervalo en ms? Obviamente quisiera que fuera efectivo pero no repetir innecesariamente. ¿Existe un intervalo "estándar" que algunos de los marcos utilizan para su sondeo? Se agradecen las sugerencias. – UICodes

+0

Creo que dependería exactamente de lo que pretendas hacer; no hay una sola respuesta. ¿Qué objeto estás encuestando, con qué frecuencia esperas que cambie, cuántas otras propiedades se definen en él para pasar? ¡Mientras que podrías salirte con un intervalo muy pequeño de 50 ms en un navegador de escritorio moderno, para un objeto bien poblado en un navegador débil como IEMobile6 que podría ponerlo de rodillas! Por cierto, para los objetos de host como 'navigator' no hay ninguna garantía de que establecer nuevas propiedades, o usar' for ... in' para iterar sobre ellas, ¡funcionará! : -S – bobince

+0

ya no puede capturar los cambios de propiedad en muchos objetos alojados (por ejemplo, intente definir un getter/setting en varias propiedades de objeto DOM), así que no veo el problema que proporcionar un notificador de cambio de objeto general porque. – Michael

1

ES6 introduce el concepto de proxies: es6 proxies on MDN.

Aquí está un ejemplo sencillo:

let objectToSpy = {}; 
let handler = { 
    set: (target, prop, value)=>{ 
     console.log('new prop:', prop); 
     target[prop] = value; 
    } 
}; 

let proxy = new Proxy(objectToSpy,handler); 
proxy.testProp = 'bla'; //prints: "new prop: testProp" 
+0

Esto iniciará sesión en cada cambio de propiedad, pero agregar una instrucción if adicional hará el trabajo. [Fiddle] (https://jsfiddle.net/apt1e1a9/4/) Gracias – dwonisch

Cuestiones relacionadas