ECMAScript 6类中静态方法的目的

Wal*_*man 7 javascript class ecmascript-6

ES5的哪些问题是ES6中应该处理的静态类方法?

Babel文档在其关于ES6类的部分中有以下示例,但它实际上并未说明此模式实现的内容.

类支持基于原型的继承,超级调用,实例和静态方法以及构造函数

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*zer 7

如果使用Babel编译ES6代码,并且某些类包含静态方法,则ES5生成的代码将只是将静态函数添加到构造函数中.

那么,这个ES6 ES2015代码:

class A {
   static doStuff() {}
}
Run Code Online (Sandbox Code Playgroud)

......等于(在ES5中):

function A() { }
A.doStuff = function() { };
Run Code Online (Sandbox Code Playgroud)

为什么需要静态功能?好吧,转换后的代码根本不支持静态,因为即使函数是对象,静态函数也会转换为构造函数的自身属性.

静态函数或属性可用于实现工厂模式:

class A {
   static create() {
      // Specific factory method code
   } 
}

var instance = A.create();
Run Code Online (Sandbox Code Playgroud)

无论如何,静态成员使用是一个非常分散的主题,它超出了客观答案的范围.它有很多用例,对任何编程语言都是通用的.


c-s*_*ile 4

考虑仅包含静态方法的类:

class MyNamespace {
  static foo() { ... }
  static bar() { foo(); }
}
Run Code Online (Sandbox Code Playgroud)

这是一种非常方便的组织代码的方式——将东西放在命名空间中。

MyNamespace.foo();
MyNamespace.bar();
Run Code Online (Sandbox Code Playgroud)

这不同于其他 OOP 语言中的标准静态方法用例

  • 使用对象文字作为命名空间。不是空课。 (2认同)