2017-10-17 3 views
3

est-il ok selon le décorateur proposal d'avoir un décorateur sur un getter ou setter de classe? Ou sont-ils seulement autorisés sur les méthodes normales? par exemple.Utilisation de décorateurs ES sur les classes Get et Set méthodes

class Foo extends Bar { 

    @override 
    get someProp() { 
    super.someProp + 2; 
    } 
} 

certaines bibliothèques/cadres fournissent de tels décorateurs. Mais par exemple, l'analyseur Babel Babylone le signale comme une erreur!

+2

Il est parfaitement bien d'avoir un décorateur sur une définition de propriété dans le corps de la classe. Le décorateur doit bien sûr être capable de gérer le type de descripteur. – Bergi

+0

Y at-il quelque chose de flou sur ma réponse? –

Répondre

2

Je pense que c'est très bien du point de vue du décorateur à appliquer à un champ de setter/getter, fondamentalement n'importe quel domaine. Puisque la propriété "normal" et la propriété setter/getter diffèrent dans le type de descripteur de propriété - data descriptor vs accessor descriptor et que le décorateur est appliqué à un descripteur de propriété, il peut être appliqué à n'importe quelle propriété, y compris les propriétés "setter/getter" et "method".

Par exemple, vous pouvez modifier le setter à la propriété « normale » à l'intérieur du décorateur:

function removesetter(klass, prop, descriptor) { 
    return { 
     value: 5, 
     writable: true 
    } 
} 

class Foo { 
    @removesetter 
    get someProp() { 
     return 3; 
    } 
} 

const f = new Foo(); 
console.log(f.someProp); // 5 
+0

merci pour votre réponse. Serait-il un problème s'il y a à la fois le setter et getter avec un décorateur dans la classe? ou il suffit que la propriété get ou set du descripteur ne soit mise à jour que dans chaque décor? – user2520818

+0

et est-il possible dans la fonction décorateur de déterminer si la méthode appelée est un setter ou un getter? – user2520818

+0

@ user2520818, le décorateur est appelé avec le descripteur. il spécifie à la fois le getter et le setter. Je ne pense pas qu'il soit possible de déterminer la méthode à suivre. Les deux getter/setter sont essentiellement juste une propriété avec un descripteur d'accesseur spécial et donc vous ne pouvez pas appliquer le même décorateur à la fois setter/getter car cela n'a pas de sens –