Javascript动态地将函数附加到对象
Posted
技术标签:
【中文标题】Javascript动态地将函数附加到对象【英文标题】:Javascript dynamically attaching functions to objects 【发布时间】:2012-03-27 12:07:42 【问题描述】:如何将函数动态附加到javascript对象。例如:如果动态附加的函数是attach(),那么我应该能够将函数fn附加到onject obj,如下所示..
attach(
obj,fn,
alert(1)
)
function attach(obj,fnName,code)
obj[fnName] = code;
【问题讨论】:
【参考方案1】:如果“将函数动态附加到 javascript 对象”是指“将函数对象添加为对象属性”,那么您已经展示的语法几乎是正确的。应该是这样的:
var fnName = "testFunc";
obj[fnName] = function() alert("Test function"); ;
// or
obj.testFunc = function() ... ;
// or
obj[fnName] = nameOfFunctionDefinedElsewhereInCurrentScope;
这意味着您可以像这样调用attach()
函数:
// attach an anonymous function:
attach(obj, "newFunctionName", function() alert(1); );
// attach a function defined elsewhere
attach(obj, "newFunctionName", someFunction);
注意:attach()
函数确实一点也不省力,事实上它只是让你输入更多字符...
顺便说一下(但不要这样做),如果您要作为code
传递的参数是一串代码,请这样做:
var code = "alert(0);";
obj[fnName] = new Function(code);
更多信息:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function
【讨论】:
code
作为字符串示例正是我想要的,谢谢 :)【参考方案2】:
EDIT :其他帖子的 Function(code) 解决方案看起来更好。我不知道那个构造函数。
可能的解决方案是:
Object.prototype.attach = function(name,code)
this.name = function()
eval(code);
;
【讨论】:
eval 肯定会增加时间复杂度 :)【参考方案3】:假设函数附加的定义,你应该这样称呼它:
attach(obj, fnName, function() alert(1); );
你调用它的方式是无效的语法。
此外,您可能已经注意到,这不是一个非常有用的函数,因为您可以使用单行函数定义来做同样的事情:
obj[fnName] = function() alert(1); );
【讨论】:
【参考方案4】:如果它们已被定义,您可以将它们附加为函数对象,例如:Javascript: better way to add dynamic methods?
也可以使用new Function构造函数来动态定义函数,比如这里:Creating functions dynamically in JS
这里解释一下 eval 和 new Function 构造函数的区别:Are eval() and new Function() the same thing?
作为警告,使用 eval() 和 new Function 构造函数已引起争议,并已(在某种程度上)受到许多人的谴责,例如:Legitimate uses of the Function constructor
这里有更多关于 eval 的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
这里是关于新函数构造函数的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
【讨论】:
以上是关于Javascript动态地将函数附加到对象的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 wordpress 中动态地将一个类附加到现有的 div 中?
r [追加项目到列表]动态地将项目附加到列表,优化以与管道#R一起使用