diana icon indicating copy to clipboard operation
diana copied to clipboard

关于装饰器装饰箭头函数

Open MuYunyun opened this issue 7 years ago • 2 comments

尝试在 ts 中写了下:
class Demo {
  @Test()
  submit = 1234
}

function Test() {
  return function (target, key, descriptor) {
    console.log(descriptor)
  }
}

但是这个 descriptor 打印出来的值是 undefined(期待的是里面有 initializer 属性)

后续继续跟进。

相关文章

MuYunyun avatar Oct 06 '18 09:10 MuYunyun

原因:

  1. 加上箭头函数,原始类中此属性的继承会变成基于构造函数继承;而不加箭头函数,此属性继承会变成基于原型继承
  2. 装饰器读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;
      }
    }
  }
} 

bullyork avatar May 16 '19 12:05 bullyork

有个问题,这个this怎么拿到的

vnues avatar Oct 24 '19 03:10 vnues