修饰器在很多语言中都有,它用来修改类或者方法的行为。请注意,它是在代码编译阶段执行的,而非代码执行阶段执行。
类的修饰
它的工作原理是这样的:
1 |
|
即给类添加一个属性,至于是静态属性的还是实例属性就取决于你了。
1 |
|
上面 代码中@testable就是一个Decorator,它的第一个参数是被修饰的类本身,它类MyTestableClass
添加了一个静态的属性。如果想要添加实例属性,则可通过目标类的prototype对象操作(对JavaScript的原型模式要熟悉):
1 | function testable(target) { |
方法的修饰
和对类的修时原理相似,只是修饰器函数的参数有变动:
1 | function decorator(target, name, descriptor){ |
它相当于:
1 | Object.defineProperty(target, 'funName', descriptor); |
修饰器参数:
target
:类的原型对象class.prototype
,和修饰类不同是,修饰类的时候target参数指的是类本身。- funName:所要修饰的属性名。
- descriptor:该属性的描述对象。
在方法修饰器中对方法的修饰,只允许通过该方法的属性描述对象来实现。