在类get和setter上使用ES装饰器

问题描述:

根据装饰器proposal在类getter或setter上装饰器是否正常?还是只允许使用正常的方法?例如在类get和setter上使用ES装饰器

class Foo extends Bar { 

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

一些库/框架提供了这样的装饰器。但是例如巴贝尔解析器巴比伦认为这是一个错误!

+2

这是完全罚款,对在类体内的任何属性定义一个装饰。装饰者当然需要能够处理这种描述符。 – Bergi

+0

有没有什么不清楚我的答案? –

我认为从decorator的角度来看,它完全适用于setter/getter字段,基本上是任何字段。由于“普通”属性和setter/getter属性在属性描述符类型上不同 - data descriptor vs accessor descriptor和装饰器应用于属性描述符,它可以应用于任何属性,包括“setter/getter”和“method”属性。

例如,你可以改变二传手“正常”属性的装饰里面:

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

谢谢你的回答。如果在类中有装饰器和装饰器,那么会有什么问题吗?或者如果描述符的get或set属性仅在每个装饰中更新,就足够了? – user2520818

+0

并且在修饰器函数中可以确定所调用的方法是否是setter或getter? – user2520818

+0

@ user2520818,使用描述符调用装饰器。它指定了getter和setter。我不认为有可能确定它被调用的方法。这两个getter/setter本质上只是一个具有特殊访问器描述符的属性,因此无法将相同的装饰器应用于setter/getter,因为它没有意义 –