2012-03-01 89 views
1

這就是我想要實現的。下面是代碼的現有片 -在JavaScript中動態定義函數名稱?

function PartMetaData(dataElement) { 
this.metaData = new MetaData(dataElement); 

this.getDescription = function() { 
    return this.metaData.getElement("data-part-description"); 
}; 

this.getLength = function() { 
    return this.metaData.getElement("data-part-length"); 
}; 

this.getWidth = function() { 
    return this.metaData.getElement("data-part-width"); 
}; 

this.getHeight = function() { 
    return this.metaData.getElement("data-part-height"); 
}; 

this.getWeight = function() { 
    return this.metaData.getElement("data-part-weight"); 
}; 
} 

現在看functionname和屬性名之間的關係 - 這看起來很像可以避免重複的代碼。那是可以實現的嗎?有沒有辦法讓一個對象的「任何」函數調用,並根據函數名稱確定要做什麼?

用於例如像(語法熟了,我不知道這樣的事情在Javascript中存在,或任何其他語言爲此事)

function PartMetaData(dataElement){ 
this.metaData = new MetaData(dataElement); 

this.get(name?) = function() { 
    return this.metaData.getElement("data-part-" + name.toLower()); 
} 

使得來電者仍可以調用

partMetaData.getDescription(); 

任何想法?我知道我可以更改簽名並使其成爲一個功能,我只想知道簽名是否可以保留爲一些JS(黑色?)魔術。謝謝!

回答

3

您可以創建一個輔助函數,您可以像這樣使用它來創建所有這些方法。

function PartMetaData(dataElement) { 
    this.metaData = new MetaData(dataElement); 

    function makeAccessor(o, itemName) { 
     var ucase = itemName.substr(0,1).toUpperCase() + itemName.substr(1); 
     o["get" + ucase] = function() { 
      return this.metaData.getElement("data-part-" + itemName); 
     } 
    } 

    var items = ["description", "weight", "height", "width", "length"]; 
    for (var i = 0; i < items.length; i++) { 
     makeAccessor(this, items[i]); 
    } 
} 

一個稍微不同的接口這樣做的一個簡單的方法是這樣的:

function PartMetaData(dataElement) { 
    this.metaData = new MetaData(dataElement); 
    this.getProperty = function(name) { 
     return this.metaData.getElement("data-part-" + name); 
    } 
} 

而且,你會使用這樣的:

partMetaData.getProperty("height"); 
+0

+1 I就像第一個選項一樣,我試圖避免第二個選項。然而,即使在這裏,我也需要事先知道可能進入哪種類型的呼叫。有沒有辦法不這樣做? (約束可能是避免異常的好辦法,但我仍然想知道是否有辦法避免這種情況)。 – 2012-03-01 06:07:23

+0

@RoopeshShenoy - 您可以通過使'makeAccessor()'函數成爲公共方法並在使用訪問器方法之前讓別人調用它來動態添加方法。但是,如果沒有先定義方法,你不能只擁有一個方法。有人必須在可以使用之前對其進行定義。 getProperty()解決方案提供了100%動態選項,無需事先定義任何內容。 – jfriend00 2012-03-01 06:15:52

+0

看起來像這樣,實際上我比第一個更喜歡第二個選項,但如果可以的話,我不想更改界面。遺留代碼:-(需要大量的重構 – 2012-03-01 06:18:40

0

呀,combinging jfriend的解決方案很好地工作:

function PartMetaData(dataElement) { 
    this.metaData = new MetaData(dataElement); 

    this.getProperty = function(name) { 
     return this.metaData.getElement("data-part-" + name); 
    } 

    this.makeAccessor = function(name) { 
     this["get" + name.substr(0,1).toUpperCase() + name.substr(1)] = 
      function() { return this.getProperty(name); } 
    } 

    var items = ["description", "weight", "height", "width", "length"]; 
    for (var i = 0; i < items.length; i++) { 
     this.makeAccessor(this, items[i]); 
    } 
}