class這個(gè)概念,在其他編程語言中很早就實(shí)現(xiàn)了玲销,而JavaScript語言并沒有實(shí)現(xiàn),一直以來,開發(fā)者都是使用函數(shù)function和原型prototype來模擬類class實(shí)現(xiàn)面向?qū)ο蟮木幊?/p>
ES6中JavaScript有了class的概念缀雳。但實(shí)際上,JavaScript的class本質(zhì)上也是基于原型prototype的實(shí)現(xiàn)方式做了進(jìn)一步的封裝梢睛,使用起來更簡單明了肥印。也就是說它實(shí)際上也是函數(shù)function和原型prototype實(shí)現(xiàn)识椰。
基本用法
//定義一個(gè)Animal類
class Animal {
//構(gòu)造函數(shù)constructor
constructor(color){
this.color = color;
}
}
代碼很簡短,通過關(guān)鍵字class來聲明一個(gè)名字叫Animal的類深碱,可以看到類里面(花括號 {}里面)有一個(gè)叫constructor方法腹鹉,它就是構(gòu)造方法,構(gòu)造方法里面的this敷硅,指向的是該類實(shí)例化后的對象功咒,這就是實(shí)現(xiàn)了一個(gè)類的聲明。
其中绞蹦,構(gòu)造方法constructor是一個(gè)類必須要有的方法力奋,默認(rèn)返回實(shí)例對象;創(chuàng)建類的實(shí)例對象的時(shí)候幽七,會(huì)調(diào)用此方法來初始化實(shí)例對象景殷。如果你沒有編寫constructor方法,執(zhí)行的時(shí)候也會(huì)被加上一個(gè)默認(rèn)的空的constructor方法澡屡。
類的屬性和方法
class Animal {
//構(gòu)造方法
constructor(name){
//屬性name
this.name = name;
}
//自定義方法getName
getName(){
return this.name;
}
}
上面的代碼中滨彻,類有2個(gè)方法:constructor( )、getName()挪蹭。
其中constructor方法是構(gòu)造方法亭饵,在實(shí)例化一個(gè)類的時(shí)候被調(diào)用。constructor方法是必須的梁厉,也是唯一的辜羊,一個(gè)類不能含有多個(gè)constructor構(gòu)造方法〈使耍可以在方法里面自定義一些對象的屬性八秃,比如案例中的name屬性。
此外肉盹,還自定義了一個(gè)getName( )方法昔驱,它屬于類的實(shí)例方法,實(shí)例化后對象可以調(diào)用此方法上忍。
類的實(shí)例對象
class Animal {
//構(gòu)造方法
constructor(name){
//屬性name
this.name = name;
}
//自定義方法getName
getName(){
return `This is a${this.name}`;
}
}
//創(chuàng)建一個(gè)Animal實(shí)例對象dog
let dog = new Animal('dog');
dog.name; //結(jié)果:dog
dog.getName(); //結(jié)果:This is a dog
通過new來創(chuàng)建了實(shí)例對象dog骤肛,構(gòu)造方法會(huì)把傳進(jìn)去的參數(shù)“dog”通過this.name賦值給對象的name屬性,所以dog的name屬性為“dog”窍蓝,對象dog還可以調(diào)用自己的實(shí)例方法getName( )腋颠,結(jié)果返回:“This is a dog”。
創(chuàng)建實(shí)例對象的注意點(diǎn):
- 必須使用new創(chuàng)建字來創(chuàng)建類的實(shí)例對象
- 先聲明定義類吓笙,再創(chuàng)建實(shí)例淑玫,否則會(huì)報(bào)錯(cuò)
類的靜態(tài)方法
class Animal {
//構(gòu)造方法
constructor(name){
//屬性name
this.name = name;
}
//自定義一個(gè)靜態(tài)方法
static friends(a1,a2){
return `${a1.name} and ${a2.name} are friends`;
}
}
//創(chuàng)建2個(gè)實(shí)例
let dog = new Animal('dog');
let cat = new Animal('cat');
//調(diào)用靜態(tài)方法friends
Animal.friends(dog,cat);
//結(jié)果:dog and cat are friends
靜態(tài)方法和實(shí)例方法不同的是:靜態(tài)方法的定義需要使用static關(guān)鍵字來標(biāo)識,而實(shí)例方法不需要;此外絮蒿,靜態(tài)方法通過類名來的調(diào)用尊搬,而實(shí)例方法通過實(shí)例對象來調(diào)用。
類的繼承
ES6使用extends關(guān)鍵字來實(shí)現(xiàn)子類繼承父類
//父類Animal
class Animal {//...}
//子類Dog
class Dog extends Animal {
//構(gòu)造方法
constructor(name,color){
super(name);
this.color = color;
}
}
上面的代碼中土涝,定義兩個(gè)類毁嗦,Animal類作為父類,Dog類作為子類回铛,然后通過關(guān)鍵字extends來實(shí)現(xiàn)繼承狗准,此外,我們還注意到一個(gè)關(guān)鍵字super茵肃,它相當(dāng)于是父類中的this腔长。
使用super的注意點(diǎn):
- 子類必須在constructor方法中調(diào)用super方法
- 必須先調(diào)用super( ),才可以使用this验残,否則報(bào)錯(cuò)
get和set關(guān)鍵字
在class的內(nèi)部可以使用get和set關(guān)鍵字捞附,對某個(gè)屬性設(shè)置存值函數(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'