class這個概念,在其他編程語言中很早就實現(xiàn)了,而JavaScript語言并沒有實現(xiàn),一直以來,開發(fā)者都是使用函數(shù)function和原型prototype來模擬類class實現(xiàn)面向對象的編程
ES6中JavaScript有了class的概念。但實際上,JavaScript的class本質上也是基于原型prototype的實現(xiàn)方式做了進一步的封裝,使用起來更簡單明了。也就是說它實際上也是函數(shù)function和原型prototype實現(xiàn)。
基本用法
//定義一個Animal類
class Animal {
//構造函數(shù)constructor
constructor(color){
this.color = color;
}
}
代碼很簡短,通過關鍵字class來聲明一個名字叫Animal的類,可以看到類里面(花括號 {}里面)有一個叫constructor方法,它就是構造方法,構造方法里面的this,指向的是該類實例化后的對象,這就是實現(xiàn)了一個類的聲明。
其中,構造方法constructor是一個類必須要有的方法,默認返回實例對象;創(chuàng)建類的實例對象的時候,會調用此方法來初始化實例對象。如果你沒有編寫constructor方法,執(zhí)行的時候也會被加上一個默認的空的constructor方法。
類的屬性和方法
class Animal {
//構造方法
constructor(name){
//屬性name
this.name = name;
}
//自定義方法getName
getName(){
return this.name;
}
}
上面的代碼中,類有2個方法:constructor( )、getName()。
其中constructor方法是構造方法,在實例化一個類的時候被調用。constructor方法是必須的,也是唯一的,一個類不能含有多個constructor構造方法??梢栽诜椒ɡ锩孀远x一些對象的屬性,比如案例中的name屬性。
此外,還自定義了一個getName( )方法,它屬于類的實例方法,實例化后對象可以調用此方法。
類的實例對象
class Animal {
//構造方法
constructor(name){
//屬性name
this.name = name;
}
//自定義方法getName
getName(){
return `This is a${this.name}`;
}
}
//創(chuàng)建一個Animal實例對象dog
let dog = new Animal('dog');
dog.name; //結果:dog
dog.getName(); //結果:This is a dog
通過new來創(chuàng)建了實例對象dog,構造方法會把傳進去的參數(shù)“dog”通過this.name賦值給對象的name屬性,所以dog的name屬性為“dog”,對象dog還可以調用自己的實例方法getName( ),結果返回:“This is a dog”。
創(chuàng)建實例對象的注意點:
- 必須使用new創(chuàng)建字來創(chuàng)建類的實例對象
- 先聲明定義類,再創(chuàng)建實例,否則會報錯
類的靜態(tài)方法
class Animal {
//構造方法
constructor(name){
//屬性name
this.name = name;
}
//自定義一個靜態(tài)方法
static friends(a1,a2){
return `${a1.name} and ${a2.name} are friends`;
}
}
//創(chuàng)建2個實例
let dog = new Animal('dog');
let cat = new Animal('cat');
//調用靜態(tài)方法friends
Animal.friends(dog,cat);
//結果:dog and cat are friends
靜態(tài)方法和實例方法不同的是:靜態(tài)方法的定義需要使用static關鍵字來標識,而實例方法不需要;此外,靜態(tài)方法通過類名來的調用,而實例方法通過實例對象來調用。
類的繼承
ES6使用extends關鍵字來實現(xiàn)子類繼承父類
//父類Animal
class Animal {//...}
//子類Dog
class Dog extends Animal {
//構造方法
constructor(name,color){
super(name);
this.color = color;
}
}
上面的代碼中,定義兩個類,Animal類作為父類,Dog類作為子類,然后通過關鍵字extends來實現(xiàn)繼承,此外,我們還注意到一個關鍵字super,它相當于是父類中的this。
使用super的注意點:
- 子類必須在constructor方法中調用super方法
- 必須先調用super( ),才可以使用this,否則報錯
get和set關鍵字
在class的內部可以使用get和set關鍵字,對某個屬性設置存值函數(shù)和取值函數(shù),攔截該屬性的存取行為。
class MyClass {
constructor() {
// ...
}
get prop() {
return 'getter';
}
set prop(value) {
console.log('setter: '+value);
}
}
let inst = new MyClass();
inst.prop = 123;
// setter: 123
inst.prop
// 'getter'