2012-05-21 62 views
0

我有這樣的事情設置多個JavaScript選項(MooTools的)對象一次

var obj = new someClass(el, { 
    onOne: function() { 
     doThis(); 
    }, 
    onTwo: function() { 
     doThis(); 
    }, 
    onThree: function() { 
     doThis(); 
    }, 
    onFour: function() { 
     doThat(); 
    } 
}); 

因此,前三個事件將具有相同的結果,只有第四個是不同的。像這樣,它似乎有點重複,所以我希望我可以做這樣的事情

var obj = new someClass(el, { 
    onOne: 
    onTwo: 
    onThree: function() { 
     doThis(); 
    }, 
    onFour: function() { 
     doThat(); 
    } 
}); 

但我不能。
我想知道,如果有一些方法我可以做類似的事情(不改變類本身)。認爲它會使代碼更清晰,更好地維護。

回答

3

預定義函數如何?

var myHandler = function() { 
    doThis(); 
}; 

var obj = new Class(el, { 
    onOne: myHandler, 
    onTwo: myHandler, 
    onThree: myHandler, 
    onFour: function() { 
     doThat(); 
    } 
}); 

如果你知道你還可以嘗試用for循環工作對象的鍵,例如

var passIt = { 
    onFour: function() { 
     doThat(); 
    } 
}; 

var keys = ['onOne', 'onTwo', 'onThree']; 
var l = keys.length; 
for (var i = 0; i < l; i++) { 
    passIt[keys[i]] = myHandler; 
} 

var obj = new Class(el, passIt); 
+0

雖然不是我所希望的,但這是我的問題的最佳答案。對於聰明的第二種解決方案,我的(當前的)實現並不會真正受益,但我確實可以看到一些乾淨利落的事情。 – kasimir

0

函數是在JavaScript世界first-class citizens。除非你已經在你的匿名函數省去額外的處理,下面應該工作:

var obj = new Class(el, { 
    onOne : doThis 
    , onTwo : doThis 
    , onThree : doThis 
    , onFour : doThat 
}) 

它創建爲doThisobj三法別名,叫onOneonTwoonThree,併爲doThat方法別名上obj名爲onFour

當您調用obj.onOne(...)時,它是equivalent todoThis.call(obj, ...)

注意:我不確定您在示例中正確使用MooTool的Class()構造函數。讀取docs,它看起來像Class,只有一個參數,即新創建的對象將繼承的properties對象(或函數)。如果代碼不起作用,請嘗試刪除el並將'Extends' : el屬性添加到對象文字中。但我從未親自使用過MooTools,所以我不確定會發生什麼。

+0

他說'新的Class',他的意思是'新的ClassInstance'和Class引用somethign該構造函數對象已經定義了以前。在他的定義中,他的構造函數被設置爲接受2個參數 - 一個元素和一個選項對象,這是事件處理程序來自的地方。我編輯了原始問題以反映這一點。附:用這個@fat語法去掉它,真是太好了。 :) –

+0

我想知道,因爲他有mootools標記,並且它似乎有一個全局的Class()便利函數,但文檔中的簽名與他的不匹配。 (我認爲漂亮的語法是可以幫助你發現代碼中的錯誤的語法,但是讓我們把宗教戰爭留給其他人;)) –