这里有一个链接,它解释了 Javascript 中的静态方法与实例方法。
基本上:
class SomeClass {
instancMethod() {
return 'Instance method has been called';
}
static staticMethod() {
return 'Static method has been called';
}
}
// Invoking a static method
SomeClass.staticMethod(); // Called on the class itself
// Invoking an instance method
var obj = new SomeClass();
obj.instanceMethod(); // Called on an instance of the class
ES5 中的等价物类似于:
function SomeClass() {
this.prototype.instanceMethod = function() {
return 'Instance method has been called';
}
}
SomeClass.staticMethod = function() {
return 'Static method has been called';
}
// And the invocations:
SomeClass.staticMethod();
new SomeClass().instanceMethod();
例如,当您在 IE11 中使用 babel-polyfill 时,将定义所有不存在的 ES2015+ 方法,例如 Array.from(静态方法)或 String.prototype.repeat(实例方法)等方法。就像你说的那样,这污染了全局状态,但是像这样的实例方法:
myInstanceObj.repeat(4)
如果 myInstanceObj 的类型具有 repeat 方法,它将起作用。如果在运行时 myInstanceObj 是一个字符串并且你包含了 babel-polyfill,那就太好了。但是,如果您使用 babel-runtime 在编译时知道 myInstanceObj 类型的类型(当 babel 转换您的代码时,为了知道如何转换,以及调用什么方法而不是方法重复)有时会很棘手/不可能,这就是为什么上面的实例方法有时很难通过 babel-runtime && transform-runtime 插件进行转换。
另一方面代码如下:
Array.from([1, 2, 3], x => x + x);
真的很容易转换,我们在编译时知道 Array.from 是来自对象 Array 的方法,所以在 IE11 中我们将使用任何东西来代替它......在这里放代码......
如果我们使用 babel-polyfill,这个方法已经存在,因为添加这个方法已经污染了全局范围,所以一切都很好。这一切都取决于你需要什么。