2016-01-27 94 views
1

如果我有這樣的:如何在JavaScript中動態創建靜態方法?

class Math { 
    static add(a, b) { 
    return a + b 
    } 
} 

,我希望把它變成:

class Math { 
    static add(a, b) { 
    return a + b 
    } 
    static subtract(a, b) { 
    return a - b 
    } 
} 

有沒有辦法來動態地做到這一點?例如。

class Math { 
    static add(a, b) { 
    return a+b 
    } 
} 

Math.extend({ 
    subtract: function(a, b) { 
    return a-b 
    } 
}) 

Math.subtract(1,1) // 0 

回答

4

靜態方法只是構造函數上的方法。因此,所有你需要做的是分配方法Math

Object.assign(Math, { 
    subtract(a, b) { 
    return a - b 
    } 
}); 
+0

爲什麼當'Math.subtract = function(){...}'應該可以正常工作時使用'Object.assign()'? – jfriend00

+0

由於OP使用'Math.extend(...)'使它看起來像他們可能想要添加更多的方法,在這種情況下'Object.assign'可能更有用。但是,無論什麼工作當然是好的:) –

+0

其使用分配擴展原型的常見模式,因爲這是使用屬性訪問器擴展它的唯一方法。 –

-1

您可以通過Math.subtract = function() { // code here };添加靜態方法。

+1

這不會創建一個'static'方法。這創建了一個實例方法。 – jfriend00

1

當編譯下來到ES5你基本上得到這樣的:

function Math() { 
} 
Math.add = function(a, b) { return a + b; } 

那麼下面,你可以添加一個動態靜態方法一樣這樣的:

Math.subtract = function(a, b) { 
    return a - b; 
} 

或者由於您使用ES6,你可以用一個箭頭功能:

Math.subtract = (a, b) => a - b; 
+0

你想靜態方法的這個指向類 - 所以箭頭函數不是最好的想法 –

+1

@PeterAronZentai:好的,我不認爲人們通常在靜態方法中使用'this'。在實例方法中用'this'過分困惑。 –

+1

多數民衆贊成是唯一的方法來看看它被調用什麼類 - 它也繼承了下來的鏈。 –

1

靜態方法只是在構造方法,所以你可以定義一個在任何像這樣的時候:

Math.subtract = function(a, b) { 
    return a - b; 
} 

注:這將在任何瀏覽器中運行當前使用的,因爲它不依賴於任何新的或最近的功能。

+0

爲什麼downvote?這種創建靜態方法的方法有什麼問題? – jfriend00