类的方法修饰器
方法修饰器的用法
参数:
- target:当前方法所在的对象
- key:当前方法的名称
- descriptor:当前方法的描述符
原型上的方法的target就是原型
function getNameDecoration(target: any, key: string, descriptor: any) {
console.log(target === Test.prototype); // true
}
class Test {
constructor(private name: string) {}
@getNameDecoration
getName() {
return this.name;
}
}
类的方法的target就是类本身
function getNameDecoration(target: any, key: string, descriptor: any) {
console.log(target === Test); // true
}
class Test {
constructor(private name: string) {}
@getNameDecoration
static getName() {
return this.name;
}
}
属性描述符descriptor
descriptor.value
可以修改属性的值
function getNameDecoration(target: any, key: string, descriptor: any) {
descriptor.value = () => {
return 'abc';
};
}
class Test {
constructor(private name: string) {}
@getNameDecoration
getName() {
return this.name;
}
}
const test = new Test('hello');
console.log(test.getName()); // abc
如果装饰器属性描述符descriptor.writable = false;
那么该属性可读不可写
如下类的原型和实例都不可以重写方法
function getNameDecoration(target: any, key: string, descriptor: any) {
descriptor.writable = false;
}
class Test {
constructor(private name: string) {}
@getNameDecoration
getName() {
return this.name;
}
}
const test = new Test('hello');
test.getName = () => {
return '123';
};