2010-05-05 4 views
9

Un exemple simple utilisant un objet javascript intégré: navigator.my_new_property = "some value"; // pouvons-nous détecter que cette nouvelle propriété a été ajoutée?Détecter lorsqu'une nouvelle propriété est ajoutée à un objet Javascript?

Je ne souhaite pas interroger en permanence l'objet pour rechercher de nouvelles propriétés. Existe-t-il un type de paramètre de niveau supérieur pour les objets au lieu d'indiquer explicitement la propriété à surveiller?

Encore une fois, je ne veux pas détecter si la valeur de la propriété a changé, mais plutôt quand une nouvelle propriété est ajoutée.

Des idées? merci

Répondre

6

Non. Les méthodes existantes pour déterminer quand une propriété est écrite pour:

  • un setter ECMAScript 5 défini en utilisant defineProperty(obj, name, fn);
  • un setter JavaScript hérité défini à l'aide de __defineSetter__(name, fn);
  • un héritage Netscape/Mozilla watch(name, fn);

sont tous basés sur des noms, donc impossible d'intercepter une nouvelle propriété en cours d'écriture avec un nom auparavant inconnu. Dans tous les cas, navigator peut être un 'objet hôte', donc vous ne pouvez pas compter sur aucune des interfaces JavaScript normales Object qui y sont disponibles.

L'interrogation ou les méthodes de définition explicites qui fournissent un rappel sont à peu près tout ce que vous pouvez faire.

Situation similaire: Getter/setter on javascript array?

+0

Merci pour la réponse détaillée. Si je vais sur la route de vote, que considerez-vous comme un bon intervalle en ms? Évidemment, je voudrais qu'il soit efficace, mais ne répète pas inutilement. Y a-t-il un intervalle "standard" que certains cadres utilisent pour leur interrogation? Les suggestions sont appréciées. – UICodes

+0

Je pense que cela dépend exactement de ce que vous voulez faire; il n'y a pas de réponse unique. Quel objet interrogez-vous, à quelle fréquence vous attendez-vous à ce qu'il change, combien d'autres propriétés sont définies sur ce sujet pour passer? Alors que vous pouvez vous en sortir avec un très petit intervalle comme 50ms sur un navigateur de bureau moderne, pour un objet bien peuplé sur un navigateur faible comme IEMobile6 qui pourrait le mettre à genoux! Incidemment, pour les objets hôtes comme 'navigator' il n'y a même pas de garantie que la définition de nouvelles propriétés, ou l'utilisation de' for ... in' pour itérer sur eux, fonctionnera! : -S – bobince

+0

vous ne pouvez déjà pas capturer les changements de propriétés sur de nombreux objets hébergés (par exemple, essayez de définir un getter/paramètre sur les propriétés de l'objet DOM), donc je ne vois pas le problème de fournir un notifier cause. – Michael

1

ES6 introduit le concept de proxies: es6 proxies on MDN.

Voici un exemple simple:

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

Cela se connectera à chaque modification de propriété, mais l'ajout d'une instruction if supplémentaire fera le travail. [Fiddle] (https://jsfiddle.net/apt1e1a9/4/) Merci – dwonisch

Questions connexes