Javascript动态地将函数附加到对象

时间:2012-03-10 05:44:17

标签: javascript object methods

如何动态地将函数附加到javascript对象。例如:如果动态附件的函数是attach(),那么我应该能够将函数fn附加到onject obj,如下所示。

attach(
     obj,fn,{
                  alert(1)
            }
      )


function attach(obj,fnName,code)
{
    obj[fnName] = code;
}

4 个答案:

答案 0 :(得分:6)

如果通过“将函数动态附加到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

答案 1 :(得分:1)

假设函数attach的定义,你应该像这样调用它:

attach(obj, fnName, function(){ alert(1); });

您调用它的方式是无效的语法。

此外,您可能已经注意到,这不是一个非常有用的功能,因为您可以使用单行函数定义执行相同的操作:

obj[fnName] = function(){ alert(1); });

答案 2 :(得分:0)

如果已经定义了它们,可以将它们作为函数对象附加,例如:Javascript: better way to add dynamic methods?

您还可以使用新的Function构造函数动态定义函数,例如:Creating functions dynamically in JS

以下是对eval和新Function构造函数之间差异的解释:Are eval() and new Function() the same thing?

作为警告,使用eval()和新的Function构造函数引起了争议,并且在某种程度上受到了许多人的谴责,例如:Legitimate uses of the Function constructor

以下是有关eval的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

以下是有关新Function构造函数的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

答案 3 :(得分:-1)

编辑:其他帖子的功能(代码)解决方案似乎更好。我不知道那个构造函数。

可能的解决方案可能是:

Object.prototype.attach = function(name,code) {
    this.name = function() {
        eval(code);
    };
}