js中的动态构造函数名称



我想做与这个问题完全相同的事情,但将函数用作构造函数。

> function nameFunction(name, body) {
return {[name](...args) {return body(...args)}}[name]
}
> b = nameFunction('c', function () {})
[Function: c]
> typeof b
'function'

b是一个函数,但它不是构造函数:

> new b()
Uncaught TypeError: b is not a constructor

如果以标准方式完成,它就是一个构造函数:

> b = function() {}
[Function: b]
> new b()
b {}

但名字是b,而不是c。

如何使用给定的名称而不使用eval来构建构造函数?

georg提供的答案是正确的,但不完整。为了使用动态命名函数作为构造函数,不仅需要使用普通函数,还需要保留this上下文。我们可以通过将thisarguments应用于body来做到这一点,如下所示。

function nameFunction(name, body) {
const object = {
[name]: function () {
return body.apply(this, arguments);
}
};
return object[name];
}
const Bar = nameFunction("Foo", function (foo) {
this.foo = foo;
});
console.log(Bar.name, new Bar(42));

方法不是构造函数(请参阅https://262.ecma-international.org/7.0/#sec-函数创建和https://262.ecma-international.org/7.0/#sec-functionallocate(。只需将其定义为一个普通函数:

function nameFunction(name, body) {
return {[name]: function(...args) {return body(...args)}}[name]
}
b = nameFunction('c', function () {})
new b

最新更新