2016-01-27 55 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