javascript – 用类装饰器覆盖构造函数?

前端之家收集整理的这篇文章主要介绍了javascript – 用类装饰器覆盖构造函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

如何使用ES7类装饰器覆盖构造函数

例如,我想要有类似的东西:

@injectAttributes({ foo: 42 })
class Bar {
  constructor() {
    console.log(this.foo);
  }
}

injectAttributes装饰器将在创建新实例之前将属性注入其中:

> bar = new Bar();
42
> bar.foo
42

显而易见的解决方案 – 使用不同的构造函数

 function overrideConstructor(cls,attrs) {
   Object.assign(this,attrs);
   cls.call(this);
 }

不起作用,因为创建的对象将是新构造函数的实例,而不是原始类型:

 > bar = new overrideConstructor(Bar,{foo: 42})
 42
 > bar
 [overrideConstructor {}]
 > bar instanceof Bar
 false
最佳答案
BabelJS REPL不支持装饰器所以我正在使用该功能(并手动包装),但概念是相同的.

Here代码工作,并在下面复制/粘贴:

function injectAttributes(cls,attrs) {
  const injected = function(...args) {
    Object.assign(this,attrs);
    return cls.apply(this,args);
  }
  injected.prototype = cls.prototype;
  return injected;
}


class BareBar {
  constructor() {
    console.log(this.foo);
  }
}
const Bar = injectAttributes(BareBar,{ foo: 5 })

const thing = new Bar();
console.log(thing instanceof Bar);

这打印:

5
true

装饰器创建一个新的构造函数,其中注入属性,然后复制原始原型,以便instanceof工作.

猜你在找的JavaScript相关文章