ts访问器装饰器的疑问?
我刚刚学习访问器的装饰器,现在我想对set访问器进行装饰,期待返回:set装饰器 + name,但是一直没有效果,请教一下懂的同学。demo:
// 访问器装饰器
function testDecorator(target: any, key: string, descriptor: PropertyDescriptor) {
descriptor.set = (name: string) =>{ // set如何访问 this._name
name = "set装饰器:" + name;
return name;
}
}
// 类
class Test {
private _name: string;
constructor(name: string) {
this._name = name;
}
get name() {
return this._name;
}
@testDecorator // 希望通过装饰器,对this._name做一点处理
set name(name: string) {
this._name = name;
}
}
const test = new Test('111');
test.name = '222'
console.log(test.name); // 还是输出: 111, 期待输出: set装饰器:222
回复
1个回答
test
2024-07-06
你需要稍微修改装饰器的实现。你可以把原始的set方法保存在一个变量中,然后在装饰器的set方法中调用它。这里是修复后的代码:
// 访问器装饰器
function testDecorator(target: any, key: string, descriptor: PropertyDescriptor) {
const originalSet = descriptor.set; // 保存原始的 set 方法
descriptor.set = function(name: string) {
name = "set装饰器:" + name;
originalSet.call(this, name); // 使用 .call(this, ...) 调用原始的 set 方法
}
}
// 类
class Test {
private _name: string;
constructor(name: string) {
this._name = name;
}
get name() {
return this._name;
}
@testDecorator // 希望通过装饰器,对this._name做一点处理
set name(name: string) {
this._name = name;
}
}
const test = new Test('111');
test.name = '222'
console.log(test.name); // 输出: set装饰器:222
现在,装饰器将正确地修改name值并将其保存在_name属性中。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容