diana
diana copied to clipboard
关于装饰器装饰箭头函数
尝试在 ts 中写了下:
class Demo {
@Test()
submit = 1234
}
function Test() {
return function (target, key, descriptor) {
console.log(descriptor)
}
}
但是这个 descriptor 打印出来的值是 undefined(期待的是里面有 initializer 属性)
后续继续跟进。
相关文章
原因:
- 加上箭头函数,原始类中此属性的继承会变成基于构造函数继承;而不加箭头函数,此属性继承会变成基于原型继承
- 装饰器读descriptor是读原型属性上的descriptor的,所以加了箭头函数,descriptor读不到,即为undefined
解决思路:
改造descriptor,让原来属性变成一个访问器属性,这样通过set过来的属性,我们就能取到当前的属性到底是什么
const decorator = function(): any {
return function(
target: any,
_name: string,
descriptor: any
){
let v: any
return {
enumerable: true,
configurable: true,
get: function() {
if (descriptor) {
v = descriptor.value
}
if (typeof v === 'function') {
return function(this: any) {
doSth()
return v.apply(this, arguments)
}
}
},
set: function(c: any) {
v = c;
}
}
}
}
有个问题,这个this怎么拿到的