2015-09-10 59 views
13

我有一個簡單的類與單個方法exec(arg1,..,argn)我想有一個別名的方法調用exec與預定義的參數值(例如exec_sync = exec.bind(this, true))。正確的方法動態添加函數到ES6類

下面的伎倆:

class Executor { 
    constructor() { 
    this.exec_sync = this.exec.bind(this, true); 
    } 

    exec(sync, cmd, args/* ... */) { 
    // impl 
    } 
} 

我不知道這是否是一個好主意,或者這是慣用的以ES6。

UDATE:

在實際生活中的例子我有分別爲3和4的環,其用於動態地添加的12種別名方法對類的總數兩個嵌套循環。當你實際上可以利用JS作爲基於原型的編程語言時,明確定義別名方法將是一項繁瑣的任務。

更新2 - 示例:

假設我們有有一個方法request(method, body)一個簡單的HTTP客戶端,我們希望提供別名方法GETPUT,等它看起來像下面這樣:

class HTTP { 
    constructor() { 
    ['GET', 'PUT', 'POST', 'DEL'].forEach((method) => { 
     this[method] = this.request.bind(this, method); 
    }, this); 
    } 

    request(method, body) { 
    // execute the HTTP request 
    } 
} 
+0

爲什麼不明確創建多個功能? 'exec_sync(... args){return this.exec(true,... args); }' – zerkms

+0

@zerkms我認爲這會更清楚該班的工作。我只是對做這種事情的可能性感興趣。 –

+0

ES6類只是語法糖。在運行時向對象添加屬性方面沒有任何變化。 –

回答

19

你的解決方案是好的,但它會更好地在prototype級別後,創建所有這些方法:

['GET', 'PUT', 'POST', 'DEL'].forEach((method) => { 
    Executor.prototype[method] = function (body) { 
    return this.request(method, body) 
    } 
}) 

prototype方法是稍快,因爲這段代碼只執行一次,同時,每次創建新實例時都會執行構造函數代碼。

prototype優於constructor的另一個優點是它兼容類繼承。所以,如果你延長課程時間,那麼即使你重新定義了任何這些方法,也不會有任何問題。

順便說一句,您可以使用require('http').METHODSmethods package而不是HTTP動詞的硬編碼數組。

+0

謝謝。 http的東西應該是一個例子,我不會在我的代碼中使用它:) –

+0

讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/89272/discussion-between-yan -foto-和列昂尼德 - beschastny)。 –

+0

很多ES5很哇,我的ES6路在哪裏? –

1

我不知道這是地道的(因爲它更多的是設計,而不是編程語言本身),但我個人認爲建立明確的功能會更好:

exec_sync(...args) { 
    return this.exec(true, ...args); 
} 
+0

在一個真實的例子中,我有2個嵌套循環,分別有3個和4個項目用於動態地將12個項目添加到類中。手動添加所有內容會有點麻煩。 –

+0

@YanFoto當然我會考慮將它移到一個單獨的類。 – zerkms

+0

這些方法實際上和語義上屬於這個類。如果我將它們移動到一個單獨的類中,我仍然需要明確地定義它們。或者我在這裏錯過了什麼? –