Como La réponse de Luke Schafer ( note : ceci fait référence à son message original ; mais l'ensemble de l'argument reste valable après la modification. ), je suggère également une paire de méthodes Get/Set pour accéder à votre valeur.
Cependant, je suggérerais quelques modifications (et c'est pour cela que je poste...).
Un problème avec ce code est que le champ a
de l'objet myobj
est directement accessible, il est donc possible d'y accéder / de modifier sa valeur sans déclencher les listeners :
var myobj = { a : 5, get_a : function() { return this.a;}, set_a : function(val) { this.a = val; }}
/* add listeners ... */
myobj.a = 10; // no listeners called!
Encapsulation
Ainsi, pour garantir que les écouteurs sont effectivement appelés, nous devrions interdire cet accès direct au champ a
. Comment faire ? Utilisez un fermeture !
var myobj = (function() { // Anonymous function to create scope.
var a = 5; // 'a' is local to this function
// and cannot be directly accessed from outside
// this anonymous function's scope
return {
get_a : function() { return a; }, // These functions are closures:
set_a : function(val) { a = val; } // they keep reference to
// something ('a') that was on scope
// where they were defined
};
})();
Maintenant, vous pouvez utiliser la même méthode pour créer et ajouter les écouteurs comme Luke l'a proposé, mais vous pouvez être sûr qu'il n'y a aucun moyen de lire ou d'écrire dans le fichier a
qui passent inaperçus !
Ajouter des champs encapsulés de manière programmatique
Toujours sur la piste de Luke, je propose maintenant un moyen simple d'ajouter des champs encapsulés et les getters/setters respectifs aux objets au moyen d'un simple appel de fonction.
Notez que cela ne fonctionnera correctement qu'avec types de valeurs . Pour que cela fonctionne avec types de référence une sorte de copie profonde devrait être mis en œuvre (voir celui-ci par exemple).
function addProperty(obj, name, initial) {
var field = initial;
obj["get_" + name] = function() { return field; }
obj["set_" + name] = function(val) { field = val; }
}
Cela fonctionne de la même manière que précédemment : nous créons une variable locale sur une fonction, puis nous créons une fermeture.
Comment l'utiliser ? C'est simple :
var myobj = {};
addProperty(myobj, "total", 0);
window.alert(myobj.get_total() == 0);
myobj.set_total(10);
window.alert(myobj.get_total() == 10);
0 votes
@BenjaminGruenbaum Vous voulez probablement dire MutableObserver (pour DOM). Object est seulement pour les objets JS de ce que je me rappelle.
4 votes
@HellBaby cette question concerne les variables - pas le DOM.
10 votes
@BenjaminGruenbaum d'après developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/ Object.observe est obsolète ou déprécié. Le remplacement recommandé (selon cette même page) est l'objet Proxy.
5 votes
La question porte uniquement sur
variable
Pourtant, toutes les réponses font référence àproperty
. Je me demande si on peut écouterlocal variable
changements cependant.