ECMAscript新特性 - 静态成员 static

175 阅读1分钟

类中的方法一般分为实例方法静态方法实例方法就是通过这个类构造的实例对象去调用静态方法则是直接通过类型本身去调用

静态方法,属于类的方法,即类可以直接调用的方法。为类所有实例化对象所共用(但不能用实例对象之间调用),所以静态成员只在内存中占一块区域;

实例方法,属于实例化类后对象的方法,即实例对象调用的方法。每创建一个类的实例,都会在内存中为非静态成员分配一块存储;

静态方法在一启动时就实例化了,因而静态内存是连续的,且静态内存是有限制的;而非静态方法是在程序运行中生成内存的,申请的是离散的空间。

以前去实现静态方法,就是直接在构造函数对象上去挂载方法来去实现,因为在JS当中函数也是对象也可以去添加一些方法成员。

function Person (name) { // 构造函数
    this.name = name
}
Person.prototype.say = function () { // 实例方法
    console.log(`hi, my name is ${this.name}`)
}
Person.create = function (name) { // 静态方法
    return new Person(name)
}
const leo = Person.create('leo');
leo.say()

而在 ES2015 中新增了一个专门去添加静态方法的关键词 static 这里需要注意,因为静态方法是挂载在类型上的,所以在静态方法内部它的 this 就不会去指向某一个实例对象而是当前的类。如果说,之前对 this 这样一个特性不是很清晰这一点是尤其需要注意的。

class Person {
    constructor (name) { // 构造函数
        this.name = name
    }
    say () { // 实例方法
        console.log(`hi, my name is ${this.name}`)
    }
    static create (name) { // 静态方法,用于创建 Person 类的实例
        return new Person(name)
    }
}
// 调用静态方法就是通过类加方法名的格式
const leo = Person.create('leo');

leo.say();