2010-05-05 6 views
9

Un semplice esempio che utilizza un oggetto javascript incorporato: navigator.my_new_property = "qualche valore"; // possiamo rilevare che questa nuova proprietà è stata aggiunta?Rileva quando una nuova proprietà viene aggiunta a un oggetto Javascript?

Non voglio eseguire il polling costante dell'oggetto per verificare la presenza di nuove proprietà. C'è qualche tipo di setter di livello superiore per gli oggetti invece di dichiarare esplicitamente la proprietà da monitorare?

Ancora una volta, non voglio rilevare se il valore della proprietà è cambiato, ma piuttosto quando viene aggiunta una nuova proprietà.

Idee? grazie

risposta

6

No. I metodi esistenti di determinare quando una proprietà viene scritto a:

  • un ECMAScript 5 setter definito tramite defineProperty(obj, name, fn);
  • un setter JavaScript legacy definito utilizzando __defineSetter__(name, fn);
  • una versione precedente di Netscape/Mozilla watch(name, fn);

sono tutti basati sul nome, quindi non è possibile rilevare una nuova proprietà scritta con un nome precedentemente sconosciuto. In ogni caso, navigator potrebbe essere un 'oggetto host', quindi non puoi fare affidamento su nessuna delle normali interfacce JavaScript Object disponibile su di essa.

Il polling, o metodi di setter espliciti che forniscono il callback, è tutto ciò che si può fare.

Situazione simile: Getter/setter on javascript array?

+0

Grazie per la risposta dettagliata. Se passo al percorso di votazione, quale considereresti un buon intervallo in ms? Ovviamente vorrei che fosse efficace ma non ripeto inutilmente. Esiste un intervallo "standard" che alcuni framework usano per il loro polling? I suggerimenti sono apprezzati. – UICodes

+0

Penso che dipenderebbe esattamente da ciò che stai mirando a fare; non c'è una risposta. Quale oggetto stai interrogando, quante volte ti aspetti che cambi, quante altre proprietà sono definite su di essa per passare? Mentre si può ottenere un intervallo molto piccolo come 50 ms su un browser desktop moderno, per un oggetto ben popolato su un browser debole come IEMobile6 che potrebbe metterlo in ginocchio! Per inciso, per gli oggetti host come 'navigator' non c'è nemmeno alcuna garanzia che l'impostazione di nuove proprietà, o l'uso di' for ... in' per iterare su di essi, funzionerà! : -S – bobince

+0

non è possibile acquisire le modifiche alle proprietà su molti oggetti ospitati (ad esempio, provare a definire un getter/impostazione su varie proprietà dell'oggetto DOM), quindi non vedo il problema che fornire un notificatore generale di modifiche agli oggetti sarebbe causa. – Michael

1

ES6 introduce il concetto di proxy: es6 proxies on MDN.

Ecco un semplice esempio:

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

Ciò accederà a ogni modifica di proprietà, ma aggiungendo un'istruzione if aggiuntiva farà il lavoro. [Fiddle] (https://jsfiddle.net/apt1e1a9/4/) Grazie – dwonisch

Problemi correlati