2012-07-13 85 views
0

目前我正在試圖通過一個函數添加到對象添加到一個對象。通過函數

我的代碼是:

var ob = {}; 

function add(f, fun) { 
    ob[f] = fun(); 
} 

add('hi', function() { 
    alert('hello') 
}) 

ob.hi()​ 

所以這是假設改變的OB:

var ob = { 
    hi: function(){ 
     alert('hello') 
    } 
} 

它確實警報hello但單從附加功能的觸發(我想停下來)而不是從ob.hi()函數。

感謝您的任何幫助。如果你願意,你也可以檢查fiddle

回答

2

您正在執行的功能和它的返回值的財產分配。您需要將該函數的引用分配給該屬性。更改add功能:

function add(f, fun) { 
    ob[f] = fun; //No invoking parentheses! 
} 

這裏是一個updated fiddle

如果您在原始撥弄一下控制檯,你得到什麼錯誤的提示:

Uncaught TypeError: Property 'hi' of object #<Object> is not a function

+0

爲什麼謝謝主席先生。 – Shawn31313 2012-07-13 08:05:24

+0

@ Shawn31313 - 不客氣,很高興我能幫助:) – 2012-07-13 08:08:00

+0

你幫助很大,因爲現在我終於固定的一個問題,我與圖書館建設IM – Shawn31313 2012-07-13 08:09:09

1

添加您的函數作爲對象的屬性:

ob['hi'] = function() { 
    alert('hello') 
}; 

ob[funname] = fun; 

如果函數是別處定義。

不要寫一個add功能只是設置一個屬性。用自定義setter替換該語言的標準功能不會使代碼更具可讀性。

而且不要忘了,你可以在JavaScript中定義類:

function Rect(x,y,w,h){ 
    this.x = x; 
    this.y = y; 
    this.w = w; 
    this.h = h; 
} 

Rect.prototype.contains = function(x, y) { 
    return x>=this.x && x<=this.x+this.w && y>=this.y && y<=this.y+this.h; 
}; 

new Rect(0, 1, 2, 3)創建的所有對象都具有contains功能。

+0

感謝您的回答,但我會需要設置多個屬性和我想用功能來做這件事 – Shawn31313 2012-07-13 08:05:05

+0

除了作業之外,我沒有看到使用函數來替換該語言的標準特徵的理由。如果您正在建立圖書館,請遵循最佳做法。 – 2012-07-13 08:09:50