2010-08-12 15 views
1

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Object/watchJavascript: Mozilla fonctionnalité .Voir() pour toutes les propriétés d'un objet (éventuellement cross-browser)

La méthode .Voir() le fait en bref: « Montres pour une propriété à attribuer une valeur et exécute une fonction lorsque cela se produit. "

Longue forme descriptive: "Watches pour l'affectation à une propriété nommée prop dans cet objet, appel gestionnaire (prop, oldval, newval) chaque fois que prop est défini et stockant la valeur de retour dans cette propriété.Un point de contrôle peut filtrer (ou annuler) l'affectation de valeur, en retournant un newval modifié (ou en renvoyant oldval). "

Il y a une question pour la faire fonctionner dans tous les navigateurs ici: Object.watch() for all browsers?

Je cherche quelque chose de semblable à cela. Ce que je recherche est une méthode que je peux utiliser pour adapter cette spécification: "Watches pour l'affectation à n'importe quelle propriété dans cet objet et exécute une fonction lorsque cela se produit." La principale différence est que c'est n'importe quelle propriété, et n'importe quelle propriété spécifique.

Quelqu'un peut-il créer une telle méthode ou s'il sait qu'une telle méthode existe déjà, y faire un lien? Il serait utile de le faire fonctionner dans tous les navigateurs (moins IE, ou moins IE8 si IE9 est conforme)

Éditer: Pour un exemple de ce que je veux dire, je vais montrer ce que j'ai besoin pour.

var DiscreteLine = function (leftBound, length){ 
    this.positive = []; 
    this.negative = []; 
    this.length = length; 
    this.leftBound = leftBound; 
    this.rightBound = leftBound + length 

    if (this.leftBound < 0){ 
    this.negative.length = (leftBound * -1) + 1; 
    } else { 
    this.negative.length = 0; 
    } 
    if (this.rightBound >= 0){ 
    this.positive.length = rightBound + 1; 
    } else { 
    this.positive.length = 0; 
    } 

    this.watchObject = new ObjectWatcher(handler(prop, oldval, newval){ /* some stuff */ }); 

} 

Puis, lorsque, par exemple, si quelqu'un a fait ce qui suit:

theLine = new DiscreteLine(-2, 4); 
theLine[-8] = 10; 

Le gestionnaire appellerait, avec les arguments ("-8", non défini, 10). (Ce qui finirait par se produire, c'est que le script recalculerait automatiquement les propriétés leftBound et length (comme la mise à jour automatique de la propriété length par Arrays)

Répondre

0

Cela nécessiterait essentiellement de surcharger le setter pour une propriété d'un objet déjà défini. Pour autant que je sache, cela n'est possible que dans ECMAScript 5 (via Object.defineProperty) et pour l'instant, je ne suis pas sûr de savoir quels navigateurs supportent cela, voire pas du tout, donc ce ne serait pas "cross-browser" comme vous l'aviez demanda

Edit:. votre exemple rend votre exigence claire maintenant, je crains que la langue ne fournit aucun moyen d'être averti lorsque de nouvelles propriétés sont ajoutées à un objet vous ne vraiment dans votre exemple, ».. t avoir le choix e xcept pour remplacer la notation de tableau par un appel de fonction.

+0

Je ne vois pas comment on peut créer un observateur de toutes les propriétés d'un objet en utilisant cette méthode. En outre, Firefox 4.0 le supportera, au minimum. Cela permet de changer les aspects clés d'une propriété (quelque chose qui me sert de toute façon), mais pas de regarder l'objet. – Havvy