javascript:创建命名函数,但其名称存储在变量中

javascript:创建命名函数,但其名称存储在变量中,javascript,function,constructor,instance,Javascript,Function,Constructor,Instance,我有一种情况,在我的应用程序中的某个时刻,我需要构造函数的名称 instance.constructor.name 但是,当我创建构造函数时,它的名称存储在一个变量中。所以,让你知道我想要什么 var nameOfTheFunction = "Test" ; var BarFoo = function() { /* do stuff */ } ; BarFoo.name = nameOfTheFunction ; 这当然不行,因为name属性是只读的 那么,是否有可能动态创建一个构造函数,其

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

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

在您的情况下,我想我们可以使用
eval

var nameOfTheFunction = "Test" ;
var BarFoo = eval("function " + nameOfTheFunction + "() { /* do stuff */ }") ;

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

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

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

function generateFunction(functionName) {
    function __REPLACE__() {
        // your function's code
    }
    eval(__REPLACE__.toString().replace('__REPLACE__', functionName));
    return functionName;
}

我不认为
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;
}

Eval不是一个好的解决方案!不要使用EVAL!这不安全。@AwakeZoldiek“这不安全”在这里不是相关的原因。要么解释一下你的意思,要么给出一个更好的理由,因为你正在执行不可信的源代码,所以eval是一个安全问题。如果攻击者可以修改字符串连接中使用的参数,他们可能会在用户浏览器中执行恶意代码,并运行漏洞攻击、窃取Cookie…等等。@AwakeZoldiek
eval
并不比浏览器的控制台/开发工具更危险。谁说过“不可信”的源代码?链接是Thnx!我认为“新功能”比“评估”好。你认为它为什么会产生全局变量?var Constr=new Function(){'return Function'+name+'(){};}如果您将函数声明为Window的属性,则可以访问Window(即一切)的每个对象都将您的函数作为其作用域中的变量。你是对的,
new Function()
eval()
好。使用我编写的第二个解决方案,你可以将你的函数作为一个普通的JavaScript函数来编写,然后将它作为一个参数传递给
generateFunction()
。注意:用函数构造函数创建的函数不会为它们的创建上下文创建闭包;它们总是在窗口上下文中运行(除非函数体以“use strict”;语句开头,在这种情况下,上下文是未定义的)。您认为应该使用“eval”而不是“new Function(){..}”吗?原因是@Jeanluca Scaljeri:注意:使用函数构造函数创建的函数不会为其创建上下文创建闭包;它们总是在窗口上下文中运行(除非函数体以“use strict”;语句开头,在这种情况下,上下文是未定义的)。从@JeanlucaScaljeri开始,我不确定
newfunction(){…}
将如何帮助您。据我所知,它不允许你指定一个名字?我真的不知道这有什么好处。你能解释一下你在尝试什么吗?你是对的,我找到了一个更简单的方法: