我的情况是,在我的应用程序中的某个时刻我需要构造函数的名称
instance.constructor.name
但是,当我创建构造函数时,我将其名称存储在变量中。所以,让你知道我想要什么
var nameOfTheFunction = "Test" ;
var BarFoo = function() { /* do stuff */ } ;
BarFoo.name = nameOfTheFunction ;
这当然不起作用,因为name属性是只读的。
因此可以动态创建一个构造函数,其最终结果是它创建的实例将具有
instance.constructor.name === nameOfTheFunction
更新:在下面查看我的评论,因为它符合我的要求。但是对于这个问题,多亏了答案,我最初是在寻找这个
(new Function( 'base', 'return function ' + Foo.name + '(){ base.apply(this, arguments); };'))(Foo) ;
此解决方案的问题在于,此处创建的内容不是Foo的实例,除非您执行类似this的操作,这使我在下面的评论中找到了解决方案!
答案 0 :(得分:1)
我认为eval
不是一个坏主意。但我建议使用工厂函数,这样你就不必在字符串文字中编写函数的所有代码:
function createNamedFunction(name, func) {
eval("var f = function " + name + "(){return func.apply(this, arguments);};");
return f;
}
var t = createNamedFunction("myFunc", function () {
console.log("hello");
});
console.log(t.name); //myFunc
t(); //hello
<强> FIDDLE 强>
修改强>
您也可以直接操作函数的字符串表示,因此您不必使用apply
方法:
function createNamedFunction(name, func) {
var fstr = func.toString(),
index = fstr.indexOf("(");
fstr = "function " + name + fstr.substring(index);
eval("var f = " + fstr + ";");
return f;
}
答案 1 :(得分:0)
在您的情况下,我认为我们可以使用eval
var nameOfTheFunction = "Test" ;
var BarFoo = eval("function " + nameOfTheFunction + "() { /* do stuff */ }") ;
答案 2 :(得分:0)
如果您在浏览器端,则可以使用以下解决方案:
Javascript: Dynamic function names
当然这会使你的函数成为一个全局变量。
编辑:如果您绝对想使用eval
,可以使用以下构造:
function generateFunction(functionName) {
function __REPLACE__() {
// your function's code
}
eval(__REPLACE__.toString().replace('__REPLACE__', functionName));
return functionName;
}