CoffeeScript: Getter/Setter dans les Initialiseurs d'Objets
ECMAScript nous permet de définir des accesseurs ou setters comme suit:
[text/javascript]
var object = {
property: 7,
get getable() { return this.property + 1; },
set setable(x) { this.property = x / 2; }
};
Je peux contourner si je suis en utilisant un classe:
[texte/coffeescript]
"use strict"
Function::trigger = (prop, getter, setter) ->
Object.defineProperty @::,
get: getter
set: setter
class Class
property: ''
@trigger 'getable', ->
'x'
member: 0
Mais que faire si je veux définir le déclencheur sur la objet directement - sans à l'aide de defineProperty
/-ies
. Je veux faire quelque chose comme (c'est pas de travail de cette façon):
[text/x-pseudo-coffeescript]
object =
property: 'xhr'
get getable: 'x'
Il fonctionne en JavaScript sans aucun problème et je ne veux pas que mes scripts de régresser quand je suis en utilisant CoffeeScript. N'est-il pas un moyen de le faire aussi à l'aise que dans le JavaScript/ECMAScript? Merci.
- Pas pour le moment :(. Un formulaire de demande de devis FAQ: Q: allez-vous ajouter de la fonctionnalité X où X dépend de la plate-forme? R: Non, la mise en œuvre de fonctionnalités spécifiques ne sont pas autorisés en tant que politique. Tout ce que vous écrivez en CoffeeScript doit être pris en charge et praticable, sur tout le JavaScript de mise en œuvre (dans la pratique, cela signifie que le plus petit dénominateur commun est IE6). Ainsi, les fonctionnalités suivantes ne seront pas mises en œuvre: les accesseurs & setters, le rendement. Je pense que le fait d'avoir getter & poseur de syntaxe littérale serait une belle fonctionnalité d'opt-in pour CoffeeScript.
- Merci, c'est ce que je voulais savoir. - Mais: Est-il possible de construire une telle fonctionnalité d'opt-in pour CoffeeScript proprement (sans modifier le compilateur directement)?
- Je ne qui serait possible. Il y a branche qui les met en œuvre, mais il n'a pas été maintenue pendant une longue période, il semble (et je ne le recommande pas à l'aide d'un CoffeeScript fourche juste pour cette fonction). J'ai ajouté une réponse à mon commentaire précédent et un peu plus d'informations.
- Errata: je ne pense pas que ce serait possible 😛
Vous devez vous connecter pour publier un commentaire.
Non, pas pour l'instant 🙁
De la CoffeeScript FAQ:
Certains GitHub questions sur getter & poseur de syntaxe: #64, #451, #1165 (il y a une belle discussion dans le dernier).
Personnellement, je pense que le fait d'avoir getter & poseur de syntaxe littérale serait une belle fonctionnalité d'opt-in pour CoffeeScript maintenant que
defineProperty
est la partie de la norme ECMAScript. La nécessité pour les getters et les setters en JavaScript peut être discutable, mais vous n'êtes pas obligé de les utiliser, simplement parce qu'ils existent.De toute façon, comme vous l'avez remarqué, il n'est pas difficile à mettre en œuvre pratique d'une fonction wrapper qui appelle
Object.defineProperty
pour les déclarations de classe. Personnellement, je voudrais utiliser l'approche proposée dans ici:Ou peut-être créer deux méthodes différentes:
Pour les objets simples que vous pouvez simplement utiliser
Object.defineProperty
(oude l'Objet.defineProperties
😉 ) sur l'objet lui-même comme Jason proposé. Peut-être étirable dans un peu de fonction:super
ne se comportent pas de la même façon que vous pouvez attendre. Pas une grosse affaire, mais mérite d'être souligné. Voir gist.github.com/4236746super
est assez fragile, je suis surpris de voir que mêmeobj = foo: -> super
compile (à quelque chose de cassé). Heureusement, la sémantique desuper
sera probablement révisée pour CoffeeScript 2. Je doute, cependant, qu'il n'y aura aucun plan pour fairesuper
être getter/setter sympathique.Voici une autre approche pour la définition des propriétés avec des getters et setters en CoffeeScript qui maintient un relativement propre syntaxe, sans rien ajouter à la Fonction globale du prototype (dont je préfère ne pas faire):
Il fonctionne bien avec de nombreuses propriétés. Par exemple, voici une classe Rectangle qui est définie dans le plan (x, y, largeur, hauteur), mais propose des accesseurs pour une autre représentation (x1, y1, x2, y2):
Voici le correspondant du code JavaScript. Profitez-en!
Vous pouvez utiliser l'Objet.defineProperty directement sur les objets JSON ainsi.
Les get/set notation ne fonctionne pas, pour diverses raisons, en CoffeeScript. La plus importante est que le compilateur n'a pas été construit pour compte pour obtenir/définir la notation.
Noter que les get/set n'est pas supporté par tous les navigateurs (en particulier, IE). Notons aussi que les nouvelles normes ECMA (ECMAScript5) mentionne l'Objet.defineProperty que la manière de définir des propriétés avec des getters/setters.
Comme @curran, je préfère ne pas modifier
Function
prototype.Ici, c'est ce que j'ai fait dans un de mes projets :
Définir quelque part une fonction d'utilité qui, pour une classe donnée renvoie 2 fonctions vous permettant d'ajouter facilement des getters et setters sur le prototype de la classe:
gs signifie getter et setter.
Ensuite, vous pouvez créer et importer les deux fonctions configurées pour votre classe :
Une approche alternative:
Merci à ceux qui nous ont précédés. Très généralement et simplement: