【问题标题】:Javascript dynamically attaching functions to objectsJavascript动态地将函数附加到对象
【发布时间】:2012-03-27 12:07:42
【问题描述】:

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

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


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

【问题讨论】:

    标签: javascript object methods


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2012-07-13
        • 2012-01-31
        • 2012-01-12
        • 1970-01-01
        • 2020-04-29
        • 2015-11-21
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多