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动态地将函数附加到对象的主要内容,如果未能解决你的问题,请参考以下文章

装饰者模式

如何在c#中动态地将名称附加到数据属性

是否可以在 wordpress 中动态地将一个类附加到现有的 div 中?

r [追加项目到列表]动态地将项目附加到列表,优化以与管道#R一起使用

javascript/jQuery:如何动态地将属性值转换为对象键? [复制]

装饰者模式