静态成员

直接在构造器上添加额外方法来模拟静态成员,这在 ES5 及更早版本中是另一个通用的模式。例如:

function PersonType(name) {
    this.name = name;
}

// static method
PersonType.create = function(name) {
    return new PersonType(name);
};

// instance method
PersonType.prototype.sayName = function() {
    console.log(this.name);
};

var person = PersonType.create("Nicholas");

在其他编程语言中,工厂方法 PersonType.create() 会被认定为一个静态方法,它的数据不依赖 PersonType 的任何实例。ES6 的类简化了静态成员的创建,只要在方法与访问器属性的名称前添加正式的 static 标注。作为一个例子,此处有个与上例等价的类:

class PersonClass {

    // equivalent of the PersonType constructor
    constructor(name) {
        this.name = name;
    }

    // equivalent of PersonType.prototype.sayName
    sayName() {
        console.log(this.name);
    }

    // equivalent of PersonType.create
    static create(name) {
        return new PersonClass(name);
    }
}

let person = PersonClass.create("Nicholas");

PersonClass 的定义拥有名为 create() 的单个静态方法,此语法与 sayName() 基本相同,只多了一个 static 关键字。你能在类中的任何方法与访问器属性上使用 static 关键字,唯一限制是不能将它用于 constructor 方法的定义。

静态成员不能用实例来访问,你始终需要直接用类自身来访问它们。