gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:22:47 25 4
gpt4 key购买 nike

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

例如,我想要这样的东西:

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

injectAttributes 装饰器会在创建新实例之前将属性注入(inject)到它们中:

> 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(new BareBar, { foo: 5 })

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

这打印:

5
true

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

关于javascript - 用类装饰器覆盖构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40796074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com