← 返回目录

class 类

class 就是"生产对象的模具"。以前用构造函数写,现在用 class,方法直接写在里面,一眼看清这个模具能干什么。

1. 基本写法对比

以前 · 构造函数 + 原型 现在 · class
function Phone(brand, price) {
  this.brand = brand;
  this.price = price;
}
// 方法要挂到 prototype 上
Phone.prototype.makeCall = function () {
  console.log("可以打电话");
};
let p = new Phone("Huawei", 5999);
class Phone {
  constructor(brand, price) {
    this.brand = brand;
    this.price = price;
  }
  // 方法直接写在类里面
  makeCall() {
    console.log("可以打电话");
  }
}
let p = new Phone("Huawei", 5999);

方法不用再挂到 prototype 上,直接写在 class 里,代码更集中、更好懂。

2. 继承:extends + super

以前 · 原型链继承(麻烦) 现在 · extends + super
function Smart(brand) {
  Phone.call(this, brand);
}
Smart.prototype = new Phone();
Smart.prototype.takePhoto = function () {
  console.log("拍照");
};
class Smart extends Phone {
  constructor(brand, color) {
    super(brand);        // 先初始化父类
    this.color = color;
  }
  takePhoto() {
    console.log("拍照");
  }
}

继承就是"子类继承父类的本事"。extends 声明继承谁,super() 先叫父类初始化,比以前的原型链简单多了。

3. 静态成员(属于类的,不属于实例)

class Phone {
  static factory = "深圳某某工厂";   // 静态属性
  static upgrade() {                 // 静态方法
    console.log("模具升级了");
  }
}
console.log(Phone.factory);   // 深圳某某工厂(用类访问)
Phone.upgrade();              // 模具升级了
	

static 的东西挂在"工厂"(类)身上,用类名访问;用实例(new 出来的对象)访问不到。

一句话:class = 生产对象的模具,constructor 初始化,extends 继承,static 属于类本身。