11
votes

Alternatives soignées à __defineGetter__?

Getters et Setters sont une beauté dans VB.NETHXXXX<

xxx

Il ressemble à une assiette de spaghettis saccadé par un kuri. Quelles sont certaines alternatives de Néater que nous avons?

Remarque: le nouveau code doit accéder à la valeur à l'aide de Nouveau test (). Largeur et non Nouveau test () .Width () .


5 commentaires

BTW j'ai besoin d'un "getter" car au lieu de retour A; Nous pouvons assumer quelque chose comme F (); retourner A;


Quelle est la différence de votre question de votre précédente? Stackoverflow.com/questions/5731039/...


Basé sur votre autre question, "A" n'est-il pas censé être partagé par toutes les instances de "test"?


@Alnitak, les questions ne sont pas liées.


@Chandu, Alnitak vient de répondre à votre question ..


3 Réponses :


11
votes

avec ES5, vous pourrez faire:

function Test() {
  var a = 1;

  return {
    get A() { return a; },
    set A(v) { a = v; }
  };
}


6 commentaires

Cette mémoire HOGS UP en tant que getter et Setter est "unique" par chaque objet. De plus, vous ne pouvez rien faire avec le prototype lors du retour d'une expression dans le constructeur.


@Tylercrompton oui c'est certainement vrai; Je suis juste à la suite du contour de la question initiale. Il serait préférable d'avoir les getters / setters sur le prototype lorsque cela est possible.


Un bref aperçu des différents getters & Setters (y compris un repère en direct) peut être trouvé ici: jsperf.com/Object-defineProperty-vs-defineGetter-vs-normal


Je suis sûr que ce que vous décrivez est une extension Firefox uniquement. La syntaxe ECMAScript5 est un peu différente et utilise des méthodes d'objet.


@kybernetikos Je ne suis pas si sûr de cela, cette syntaxe fonctionne dans Node.js utilisant V8.


Vous avez raison, je l'avais confondu avec une syntaxe de getter / setter différente.



9
votes

Voici une alternative propre (ER) (également pour les plus anciens moteurs de script): xxx

Mind You, vous ne pouvez pas l'utiliser pour définir des structures complexes privées / statiques. Vous ne pouvez obtenir que des chaînes ou des chiffres '(donc des variables immuables) avec ce motif. Peut-être que le motif peut être amélioré à l'aide de JSON.

[ EDIT ] à l'aide de JSON, vous pouvez également créer un getter de cette façon pour les objets: xxx


3 commentaires

Pourquoi avez-vous utilisé A: {TOSTRING: fonction () {renvoyer A;}} et `foobar: {tostring: fonction () {retourne json.stringify (b);}}` Au lieu de simplement A: Remettre A; et FOOBAR: retour JSON.Stringify (b) ?


@Pacerier Il s'appuie sur le comportement par défaut de quelques fonctions (telles que alerte ) appelant .tostring () automatiquement sur n'importe quel argument qui n'est pas déjà une chaîne.


@Alnitak, oui, pourquoi ne pas simplement retourner A , au lieu de retourner un objet qui renvoie a via Tostring? Je veux dire quelle est la différence ... pourquoi pas simplement retourner simplement a ?



6
votes

Dans ECMAScript5, la méthode «propre» (et conformité des normes) de faire cela est avec DéfinitionProperty.

function Test() {
    this.a = 1;
    Object.freeze(this);
}


5 commentaires

Cela n'est-il pas (juste comme la réponse acceptée) HOG up Memory? Je suis assez nouveau chez JS, mais il me semble que ces getters / setters appartiennent au prototype. Cette page suggère que dire Object.defineProperty (test.pototype, "a", {get: fonction () {...}}) Une fois la fonction test ". Ça ne serait pas "plus propre"?


Oui, tu as absolument raison. Je l'ai fait de cette façon d'être plus comme son exemple de code dans la question, mais je m'attendrais généralement à mettre des choses sur le prototype dans la mesure du possible, et j'aurais probablement dû faire ce point. Bien entendu, l'autre facteur est que si vous le faites, vous devez mettre la valeur réelle sur «Ceci», ce qui signifie que vous perdez l'aspect masquant les informations qui est toujours une honte.


@kybernetikos, alors voulez-vous dire que la réponse de Poiny n'est pas conforme aux normes?


Je pourrais avoir tort, mais autant que je sache que la propriété sur le prototype n'empêchera pas une instance de l'objet d'acquérir sa propre propriété avec le même nom qui masquera ensuite la propriété sur le prototype.


Si vous avez une propriété avec un setter sur le prototype, faire enfant.propertyname = quelqueévalue entraînera le lancement du réglage, qui n'écrit pas le nom de propriété. Vous avez raison de dire cependant que vous pouviez toujours remplacer la propriété avec un objet.defineProperty sur l'enfant.