本質上,類只是一種特殊的函數。
console.log(typeof 某類); //"function"
聲明類 class
方式 1 – 類聲明
class Car {constructor(model, year) {this.model = model;this.year = year;}
}
方式 2 – 類表達式
匿名式
const Car = class {constructor(model, year) {this.model = model;this.year = year;}
}
命名式 —— 類名稱在表達式定義的內部有效,在外部無法使用
const NamedCar = class Car {constructor(model, year) {this.model = model;this.year = year;}getName() {return Car.name;}
}
const ford = new NamedCar();
console.log(ford.getName()); // Car
console.log(ford.name); // 引用錯誤: name未定義
構造函數 constructor
每個類只能存在一個,在構造器中可以通過super()方法來調用其父類的構造器。
類的屬性(原型方法)
支持表達式命名,以下三種效果相同:
class CarOne {driveCar() {}
}
class CarTwo {['drive' + 'Car']() {}
}
const methodName = 'driveCar';
class CarThree {[methodName]() {}
}
類的修飾符
- get 獲取類的屬性值
- set 修改類的屬性值
class Obj {c="我是原生的a,只是需要在this.c暫時存儲",get a(){return this.c },set a(val){this.c=val}
}const obj = new Obj()
使用類 new
class Car {constructor(model, year) {this.model = model;this.year = year;}
}
const fiesta = new Car('Fiesta', '2010');
類的繼承 extends
class Animal {constructor(name) {this.name = name;}speak() {console.log(this.name + ' generic noise');}
}
class Cat extends Animal {speak() {console.log(this.name + ' says Meow.');}
}
class Lion extends Cat {speak() {super.speak();console.log(this.name + ' Roars....');}
}
var l = new Lion('Lenny');
l.speak();
//"Lenny says Meow."
//"Lenny Roar...."
- 子類內通過 super 調用父類
在子類的構造器中,必須先調用super()方法才能正確地獲取到this關鍵字
class Base {}
class Derive extends Base {constructor(name) {this.name = name; //'this' 不允許在 super()之前}
}
子類中,如果定義了構造器,則必須在其中調用super()方法,否則會報錯
class Base {}
class Derive extends Base {constructor() { //在構造器中沒有調用super()方法}
}
- 父類默認構造器
constructor(){}
- 子類默認構造器
constructor(...args){super(...args);
}
多重繼承
JavaScript本身不支持多重繼承,在ES6中實現mixin的一種比較流行的實現方式是編寫輸入為父類輸出為子類的函數,例如:
class Person {}
const BackgroundCheck = Tools => class extends Tools {check() {}
};
const Onboard = Tools => class extends Tools {printBadge() {}
};
class Employee extends BackgroundCheck(Onboard(Person)) {
}
Employee類依次順序繼承了BackgroundCheck類、Onboard類和Person類。
類和普通函數的區別
- 類必須先聲明,再使用
var ford = new Car(); //引用錯誤
class Car {}
- 普通函數可用先使用,再聲明
normalFunction(); //先使用
function normalFunction() {} //后聲明