Getters et Setters sont une beauté dans VB.NETHXXXX<
Il ressemble à une assiette de spaghettis saccadé par un kuri. Quelles sont certaines alternatives de Néater que nous avons? P> Remarque: le nouveau code doit accéder à la valeur à l'aide de Nouveau test (). Largeur code> et non
Nouveau test () .Width () code>. Sub> p> p>
3 Réponses :
avec ES5, vous pourrez faire:
function Test() { var a = 1; return { get A() { return a; }, set A(v) { a = v; } }; }
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.
Voici une alternative propre (ER) (également pour les plus anciens moteurs de script): 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. P> [
Pourquoi avez-vous utilisé A: {TOSTRING: fonction () {renvoyer A;}} code> et `foobar: {tostring: fonction () {retourne json.stringify (b);}}` Au lieu de simplement
A: Remettre A; CODE> et
FOOBAR: retour JSON.Stringify (b) code>?
@Pacerier Il s'appuie sur le comportement par défaut de quelques fonctions (telles que alerte code>) appelant
.tostring () code> automatiquement sur n'importe quel argument qui n'est pas déjà une chaîne.
@Alnitak, oui, pourquoi ne pas simplement retourner A code>, au lieu de retourner un objet qui renvoie
a code> via Tostring? Je veux dire quelle est la différence ... pourquoi pas simplement retourner simplement
a code>?
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); }
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 () {...}}) code> Une fois la fonction code> test code> ". Ç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 i> 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 code> 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.
BTW j'ai besoin d'un "getter" car au lieu de retour A; b> Nous pouvons assumer quelque chose comme F (); retourner A; b>
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 ..