类装饰器的参数
当我们给一个类添加装饰器时:
function classDecorator(target) { target.hasDecorator = true return target } // 将装饰器“安装”到Button类上 @classDecorator class Button { // Button类的相关逻辑 }
此处的 target 就是被装饰的类本身。
方法装饰器的参数
而当我们给一个方法添加装饰器时:
function funcDecorator(target, name, descriptor) { let originalMethod = descriptor.value descriptor.value = function() { console.log('我是Func的装饰器逻辑') return originalMethod.apply(this, arguments) } return descriptor } class Button { @funcDecorator onClick() { console.log('我是Func的原有逻辑') } }
此处的 target 变成了Button.prototype,即类的原型对象。这是因为 onClick 方法总是要依附其实例存在的,修饰 onClik 其实是修饰它的实例。但我们的装饰器函数执行的时候,Button 实例还并不存在。为了确保实例生成后可以顺利调用被装饰好的方法,装饰器只能去修饰 Button 类的原型对象。
Button.prototype
最后更新于5年前