2012-03-10 43 views
3

如何動態附加的功能,一個JavaScript object.For例如:如果用於動態附件的功能是連接(),然後我應該能夠附加函數fn來onject OBJ如下。 。的Javascript動態附着功能對象

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


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

回答

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

+0

的'code'爲String例子正是我一直在尋找,THX :) – munyul 2015-02-02 08:00:28

1

假設的功能定義連接,你應該這樣稱呼它:

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

這就是你調用它是無效的語法。

而且,正如你可能已經注意到了,這不是一個非常有用的功能,因爲您可以使用一個行函數定義做同樣的事情:

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

也許OP要動態地生成「代碼' – 2012-03-10 05:53:04

-1

編輯:其他職位的功能(代碼)解決方案顯得更好。我不知道那個構造函數。

一個可能的解決方案是:

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

eval絕對讓蒂姆e複雜性增加:) – 2012-03-10 18:41:16

0

您可以將它們作爲函數對象,如果他們已經被定義,比如這裏:Javascript: better way to add dynamic methods?

您也可以使用新的功能構造函數動態定義函數,例如:Creating functions dynamically in JS

以下是eval與新函數構造函數之間差異的解釋:Are eval() and new Function() the same thing?

警示作用,使用eval()和新的功能構造函數創建了爭議,由許多人遭到了譴責(在某種程度上),比如這裏: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