6
votes

Création de la méthode Get / Set de manière dynamique dans JavaScript

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.

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).

Comment puis-je résoudre ce problème ? xxx


1 commentaires

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. :)


4 Réponses :


7
votes

Le Cette 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 sera < em> toujours se référer à l'objet global.

EDIT: J'ai raté le fait que l'expression de la fonction est tentative 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 i doit être transmise comme un argument afin de le faire et que l'expression de fonction est présente, le contexte (le ceci ) doit être préservé: xxx

Vous pouvez également utiliser le appelle méthode pour appeler l'expression de fonction, préservant le contexte (la valeur de ceci ) et introduisant la boucle variable à la nouvelle portée en une seule étape: xxx

je vous recommanderais également à u SE un si (propriétés.hasownProperty (i)) {...} à l'intérieur du pour ... dans en boucle pour éviter d'itération des propriétés étendues utilisateur héritées de Objet.pototype .


2 commentaires

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 doit être transmis comme un argument à cette fonction, aussi le cette valeur devrait être préservé, voir mon édition.



0
votes

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).


0 commentaires

0
votes

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);
   }
 }


0 commentaires

3
votes

Vous pouvez également utiliser le moins connu de
__ definegetter __ ("varname", fonction () {});
et __ définir __ ("varname", fonction (val) {});

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]

syntaxe serait: xxx

ou vous pouvez approcher ceci avec prototypage xxx


2 commentaires

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); Pour une raison quelconque, les gens ne savent pas cette fonction. Probablement parce que son non standard?