最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript dynamically attaching functions to objects - Stack Overflow

programmeradmin0浏览0评论

How to attach a function dynamically to a javascript object.For ex: if the function for dynamic attachment is attach(),then i should be able to attach the function fn to onject obj as follows..

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


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

How to attach a function dynamically to a javascript object.For ex: if the function for dynamic attachment is attach(),then i should be able to attach the function fn to onject obj as follows..

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


function attach(obj,fnName,code)
{
    obj[fnName] = code;
}
Share Improve this question asked Mar 10, 2012 at 5:44 Jinu Joseph DanielJinu Joseph Daniel 6,29117 gold badges64 silver badges92 bronze badges
Add a comment  | 

4 Answers 4

Reset to default 9

If by "attach a function dynamically to a javascript object" you mean "add a function-object as an object property" then the syntax you've already shown is almost right. This is what it should be:

var fnName = "testFunc";
obj[fnName] = function() { alert("Test function"); };
// or
obj.testFunc = function() { ... };
// or
obj[fnName] = nameOfFunctionDefinedElsewhereInCurrentScope;

Which means you could call your attach() function like this:

// attach an anonymous function:
attach(obj, "newFunctionName", function() { alert(1); });
// attach a function defined elsewhere
attach(obj, "newFunctionName", someFunction);

Note: the attach() function really doesn't save any effort at all, in fact it just gives you more characters to type...

By the way (but don't do this), if the parameter you want to pass as code is a string of code do this:

var code = "alert(0);";
obj[fnName] = new Function(code);

More information: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

EDIT : The other post's Function(code) solution appears better. I did not know about that constructor.

A possible solution may be:

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

You can attach them as function objects if they've already been defined, such as here: Javascript: better way to add dynamic methods?

You can also use the new Function constructor to dynamically define the functions, such as here: Creating functions dynamically in JS

Here is an explanation of the differences between eval and the new Function constructor: Are eval() and new Function() the same thing?

As a warning, use of eval() and the new Function constructor have created controversy and have been condemned (to some extent) by a number of individuals, such as here: Legitimate uses of the Function constructor

Here is more information about eval: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

Here is more information about the new Function constructor: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

Assuming that definition of function attach, you should call it like this:

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

The way you invoked it is invalid syntax.

Also, as you may have noticed, that's not a very useful function, since you can do the same thing using your one-line function definition:

obj[fnName] = function(){ alert(1); });
发布评论

评论列表(0)

  1. 暂无评论