类中的方法一般分为实例方法和静态方法,实例方法就是通过这个类构造的实例对象去调用;静态方法则是直接通过类型本身去调用。
静态方法,属于类的方法,即类可以直接调用的方法。为类所有实例化对象所共用(但不能用实例对象之间调用),所以静态成员只在内存中占一块区域;
实例方法,属于实例化类后对象的方法,即实例对象调用的方法。每创建一个类的实例,都会在内存中为非静态成员分配一块存储;
静态方法在一启动时就实例化了,因而静态内存是连续的,且静态内存是有限制的;而非静态方法是在程序运行中生成内存的,申请的是离散的空间。
以前去实现静态方法,就是直接在构造函数对象上去挂载方法来去实现,因为在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();