ES5的哪些问题是ES6中应该处理的静态类方法?
Babel文档在its section regarding ES6 classes中有以下示例,但它实际上并未说明此模式的实现。
类支持基于原型的继承,超级调用,实例和静态方法以及构造函数
class SkinnedMesh extends THREE.Mesh {
constructor(geometry, materials) {
super(geometry, materials);
this.idMatrix = SkinnedMesh.defaultMatrix();
this.bones = [];
this.boneMatrices = [];
//...
}
update(camera) {
//...
super.update();
}
static defaultMatrix() {
return new THREE.Matrix4();
}
}
答案 0 :(得分:8)
如果使用Babel编译ES6代码,并且某些类包含静态方法,则ES5生成的代码将只是将静态函数添加到构造函数。
所以,这个 ES6 ES2015代码:
class A {
static doStuff() {}
}
...等于(在ES5中):
function A() { }
A.doStuff = function() { };
为什么需要静态函数? 嗯,转换后的代码根本不支持静态,因为即使是函数也是对象和静态函数变成自己的构造函数属性。
静态函数或属性可用于实现工厂模式:
class A {
static create() {
// Specific factory method code
}
}
var instance = A.create();
无论如何,静态成员使用是一个非常分散的主题,它超出了客观答案的范围。它有很多用例,对任何编程语言都是通用的。
答案 1 :(得分:4)
考虑只包含静态方法的类:
class MyNamespace {
static foo() { ... }
static bar() { foo(); }
}
这是组织代码的非常方便的方式 - 将东西放入命名空间。
MyNamespace.foo();
MyNamespace.bar();
在其他OOP语言中,这不是标准static method use cases。