J'essaie de créer un objet userDon et d'essayer de générer les méthodes d'obtention et de définition de manière programmatique (basée sur le livre Pro JavaScript de John Resig Page 37), et je le teste sur Firefox 3.5
Le problème est le suivant: Fonction UserDon, "Ceci" fait référence à l'objet Window à la place de l'objet userDon. p>
alors après avoir appelé Var userDon = New userDon (...), j'ai reçu la mise à jour et obtenir des méthodes créées sur l'objet de la fenêtre (également la soirée et la godetage). P>
Comment puis-je résoudre ce problème ? p>
4 Réponses :
Le EDIT: STRUT> J'ai raté le fait que l'expression de la fonction est tentative em> pour faire capter la variable pour gérer le getter Création de setter à l'intérieur de la boucle, mais la variable de boucle Vous pouvez également utiliser le je vous recommanderais également à u SE un Cette code> La valeur que vous utilisez appartient à l'expression de fonction d'appel automatique que vous avez à l'intérieur de la boucle et lorsque vous appelez une fonction de cette manière,
Ceci code> sera < em> toujours em> se référer à l'objet global.
i code> doit être transmise comme un argument afin de le faire et que l'expression de fonction est présente, le contexte (le
ceci Code>) doit être préservé: p>
appelle code>
méthode pour appeler l'expression de fonction, préservant le contexte (la valeur de ceci code>) et introduisant la boucle variable à la nouvelle portée en une seule étape: p>
si (propriétés.hasownProperty (i)) {...} code> à l'intérieur du
pour ... dans code> en boucle pour éviter d'itération des propriétés étendues utilisateur héritées de
Objet.pototype code>. P> p>
Sans la fonction auto-invoquant, les deux getName () et la godet () reviendront 44, car la fermeture fait référence à la dernière valeur de la matrice, qui a l'âge, se réfère à la page 29 du livre.
@PortoAlet: Vous avez raison, vous avez manqué ce point, mais cela ne suffit pas, la variable i code> doit être transmis comme un argument à cette fonction, aussi le
cette valeur code> devrait être préservé, voir mon édition.
Cela pourrait être une meilleure idée d'obtenir une fonction générique avec 2 paramètres: le nom de la propriété et la valeur (ou uniquement le nom du getter). Et cette fonction vérifierait la présence d'une fonction de Spécialité pour cette propriété et s'il n'y en ait pas, cela modifierait la valeur de la propriété (ou renvoyer sa valeur pour Getter). P>
Voici comment je voudrais le coder: -
function UserDon( properties ) { var self = this; for( var i in properties ) { (function(prop){ self[ "get" + prop ] = function() { return properties[prop]; }; self[ "set" + prop ] = function(val) { properties[prop] = val; }; })(i); } }
Vous pouvez également utiliser le moins connu de bien qu'ils soient non standard [comme x-html-remplacent le type de contenu], ils sont supportés par la majorité des non- Parez les navigateurs là-bas [chrome, firefox] p> syntaxe serait: p> ou vous pouvez approcher ceci avec prototypage p>
__ definegetter __ ("varname", fonction () {}); code>
et __ définir __ ("varname", fonction (val) {}); code>
jamais vu cela auparavant. Utilisez-vous cela vous-même?
Je l'utilise que pour le débogage où une variable est en cours d'obtention / édité. Vous définissez ("nom variable", sortieStackTrace); Et cela fonctionne également avec des styles CSS. Par exemple, vous dites objet.style .__ Défier de définir __ ("GAUCHE" ,UnessStackTraceCunction); Code> Pour une raison quelconque, les gens ne savent pas cette fonction. Probablement parce que son non standard?
Bonne question si c'est un exercice. Sinon, si vous n'effectuez aucune opération supplémentaire dans les getters / Setters, vous espérez simplement utiliser des propriétés publiques et recherchez la méthode des frais généraux. :)