class 就是"生产对象的模具"。以前用构造函数写,现在用 class,方法直接写在里面,一眼看清这个模具能干什么。
| 以前 · 构造函数 + 原型 | 现在 · 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 里,代码更集中、更好懂。
| 以前 · 原型链继承(麻烦) | 现在 · 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() 先叫父类初始化,比以前的原型链简单多了。
class Phone {
static factory = "深圳某某工厂"; // 静态属性
static upgrade() { // 静态方法
console.log("模具升级了");
}
}
console.log(Phone.factory); // 深圳某某工厂(用类访问)
Phone.upgrade(); // 模具升级了
加 static 的东西挂在"工厂"(类)身上,用类名访问;用实例(new 出来的对象)访问不到。