知食记
搜索文档…
装饰器模式
类装饰器的参数
当我们给一个类添加装饰器时:
1
function classDecorator(target) {
2
target.hasDecorator = true
3
return target
4
}
5
6
// 将装饰器“安装”到Button类上
7
@classDecorator
8
class Button {
9
// Button类的相关逻辑
10
}
Copied!
此处的 target 就是被装饰的类本身。
方法装饰器的参数
而当我们给一个方法添加装饰器时:
1
function funcDecorator(target, name, descriptor) {
2
let originalMethod = descriptor.value
3
descriptor.value = function() {
4
console.log('我是Func的装饰器逻辑')
5
return originalMethod.apply(this, arguments)
6
}
7
return descriptor
8
}
9
10
class Button {
11
@funcDecorator
12
onClick() {
13
console.log('我是Func的原有逻辑')
14
}
15
}
Copied!
此处的 target 变成了Button.prototype,即类的原型对象。这是因为 onClick 方法总是要依附其实例存在的,修饰 onClik 其实是修饰它的实例。但我们的装饰器函数执行的时候,Button 实例还并不存在。为了确保实例生成后可以顺利调用被装饰好的方法,装饰器只能去修饰 Button 类的原型对象。
最近更新 1yr ago
复制链接