给定一个字符串classname,我想动态创建一个以该字符串命名的新JavaScript函数,该函数可用于实例化对象.
我尝试过使用eval()但由于某种原因,声明的函数不会出现在全局(窗口)范围内.
eval( "function " + classname + "() {}" );
window[ classname ]; // => undefined
Run Code Online (Sandbox Code Playgroud)
有没有办法可以动态创建一个以字符串命名的新函数?
或者,或者,通过创建它后,给我一些方法来引用创建的函数eval.有趣的是,当我在Safari中调试它时,它看起来像一个局部变量.
更新:
得到它了!当然很明显,我只是eval再次使用来创建实例:
var myInstance = eval( "new " + classname );
myInstance.constructor.name; // => classname (yay)
Run Code Online (Sandbox Code Playgroud)
这应该适用于我的情况,因为我只需要在声明后立即创建一个类的实例.对于一般情况,虽然看到Pointy的答案.
如何动态地将函数附加到javascript对象.例如:如果动态附件的函数是attach(),那么我应该能够将函数fn附加到onject obj,如下所示.
attach(
obj,fn,{
alert(1)
}
)
function attach(obj,fnName,code)
{
obj[fnName] = code;
}
Run Code Online (Sandbox Code Playgroud) 维基百科关于一等公民的文章指出,"一些作者"认为,如果语言支持在运行时创建,那么函数只是一种语言中的一等公民.James Coglan撰写的这篇文章明确地将职能视为一流的公民 - 无论他是否意识到有关一流标准的争议,我不知道.
这是我的问题:
值得一提的是,基于更广义的标准(适用于大多数其他对象),JavaScript函数显然是一等公民,即它们可以作为变量传递; 因此,我觉得上面提到的标准增加了一个有趣的动态 - 或者至少是一个澄清的动态 - 给对话而不是 - 就像一个用户写的那样 - "任意".