0

我有一种情况,在我的应用程序中的某个时候需要构造函数的名称

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 的实例,除非你做这样的事情这让我在下面的评论中找到了解决方案!

4

3 回答 3

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

小提琴

编辑

您还可以直接操作函数的字符串表示,因此您不必使用该apply方法:

function createNamedFunction(name, func) {
    var fstr = func.toString(),
        index = fstr.indexOf("(");
    fstr = "function " + name + fstr.substring(index);
    eval("var f = " + fstr + ";");
    return f;
}
于 2013-08-12T14:05:10.380 回答
0

在你的情况下,我认为我们可以使用eval

var nameOfTheFunction = "Test" ;
var BarFoo = eval("function " + nameOfTheFunction + "() { /* do stuff */ }") ;
于 2013-08-12T13:54:43.417 回答
0

如果您在浏览器端,则可以使用以下解决方案:

Javascript:动态函数名称

当然,这会使您的函数成为全局变量。

编辑:如果你绝对想使用eval,你可以使用以下构造:

function generateFunction(functionName) {
    function __REPLACE__() {
        // your function's code
    }
    eval(__REPLACE__.toString().replace('__REPLACE__', functionName));
    return functionName;
}
于 2013-08-12T13:55:11.013 回答