JavaScript ES6 Class類實(shí)現(xiàn)原理詳解
JavaScript ES6之前的還沒有Class類的概念,生成實(shí)例對(duì)象的傳統(tǒng)方法是通過構(gòu)造函數(shù)。
例如:
function Mold(a,b){
this.a=a;
this.b=b;
}
Mold.prototype.count=function(){
return this.a+this.b;
};
let sum=new Mold(1,2);
console.log(sum.count()) //3
這中寫法跟傳統(tǒng)的面向?qū)ο笳Z(yǔ)言差異較大,寫起來也比較繁雜。
ES6提供了更加接近其他語(yǔ)言的寫法,引入了Class(類)的概念,作為對(duì)象的模板,可以通過class關(guān)鍵字,定義類(類似python、java等);
當(dāng)然ES6的大部分功能再ES5都能實(shí)現(xiàn),ES6的class可以看作是一個(gè)語(yǔ)法糖,只是新的class定義類的寫法讓對(duì)象原型的寫法更加簡(jiǎn)單明了、更接近與面向?qū)ο蟮木幊趟枷搿Ec上面ES5寫的類使用ES6實(shí)現(xiàn),例如:
class Mold{
constructor(a,b){
this.a=a;
this.b=b;
}
count(){
return this.a+this.b;
}
}
let sum=new Mold(1,2);
console.log(sum.count()) //3
這里ES6的類,只需用class定義,并且類的方法不需要用function定義;還有ES6的constructor方法,代表這該類的構(gòu)造方法;并且它的this關(guān)鍵字指向著實(shí)例對(duì)象。這里ES5的構(gòu)造函數(shù)Mold,相當(dāng)于ES6Mold類的constructor方法。
constructor
ES6實(shí)例對(duì)象的構(gòu)造函數(shù)就是該類本身;并且當(dāng)我們new 類名()就是執(zhí)行了constructor這個(gè)函數(shù)。
例如:
class Mold{
constructor(){
console.log("aaa")
}
}
let m=new Mold();// aaa
console.log(m.constructor===Mold);//true
上面代碼Mold類的constructor,實(shí)例化對(duì)象時(shí)執(zhí)行默認(rèn)constructor;
任何對(duì)象都有構(gòu)造函數(shù),并且構(gòu)造函數(shù)與當(dāng)前對(duì)象的類是相同;
例如:
let arr=new Array(); console.log(arr.constructor===Array);//true let str=new String(); console.log(str.constructor===String);//true let obj=new Object(); console.log(obj.constructor===Object);//true
2. 類的繼承 extends
繼承父類后,子類會(huì)繼承父類所有的方法和屬性(包括靜態(tài)方法和屬性)
如果子類沒有定義constructor方法,會(huì)默認(rèn)被添加該方法
任何子類都有constructor方法;
例如:
//class 類名 extends 被繼承的類{}
Class Father{
constructor(){
}
sum(){
console.log("abc");
}
static fn(){
console.log("hello")
}
}
Class Son extends Father{
}
let s=new Son();
s.sum()//abc,繼承了父類的sum()方法
Son.fn()//hello 繼承了父類的靜態(tài)方法fn()
繼承后的子類方法的三種處理:
1). 完全繼承,不需要重寫這個(gè)方法,子類執(zhí)行繼承方法內(nèi)容與父類相同
2). 重寫覆蓋,只需要在這個(gè)類中重寫這個(gè)方法就可以覆蓋繼承過來的內(nèi)容
3). 加工,子類可以用super調(diào)用父類的方法或?qū)傩赃M(jìn)行加工,再加上子類自己的方法和屬性
3. super
調(diào)用父類的構(gòu)造函數(shù)直接使用super(),并且可以傳參;
子類的構(gòu)造函數(shù)中,只有調(diào)用了super之后才可以使用this關(guān)鍵字,否則會(huì)報(bào)錯(cuò);
例如:
//super.父類函數(shù)();
class Father{
constructor(){
console.log("bbb");
}
}
class Son extends Father{
constructor(x){
this.x=x;//ReferenceError,報(bào)錯(cuò)
super();
this.x=x;//正確
}
}
let sum=new Son();//bbb
4. 類的static靜態(tài)
在屬性或方法前面使用 static定義類的靜態(tài)屬性和方法;
所有的靜態(tài)屬性和靜態(tài)方法都不能通過實(shí)例化的對(duì)象調(diào)用;
需要通過類來調(diào)用,靜態(tài)屬性和靜態(tài)方法是類的專屬屬性和方法,和實(shí)例化對(duì)象無關(guān),比如數(shù)組和數(shù)學(xué)方法中的:Array.from();Math.random()。
例如:
class Mold{
static x=0;
y=1;
static fn1(){
console.log("aaa")
}
fn2(){
console.log("bbb");
}
}
let m=new Mold();
console.log(m.x,m.y);//undefined , 1
m.fn1(); // TypeError
m.fn2(); // bbb
//需要通過類來調(diào)用
Mold.fn1(); //aaa
console.log(Mold.x);//0
靜態(tài)的使用場(chǎng)景:
一般靜態(tài)的方法是用來解決一系列該類型的方法;
解決具體類型的方法,不是解決某個(gè)具體對(duì)象的方法
靜態(tài)屬性,一般用于存儲(chǔ)該類型的一系列通用的屬性變量
這種存儲(chǔ),在類創(chuàng)建的時(shí)候就已經(jīng)變成全局的了,可在任何地方調(diào)用,并且不會(huì)被自動(dòng)銷毀
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用函數(shù)的惰性載入提高javascript代碼執(zhí)行效率
在 addEvent 函數(shù)每次調(diào)用的時(shí)候都要走一遍,如果瀏覽器支持其中的一種方法,那么他就會(huì)一直支持了,就沒有必要再進(jìn)行其他分支的檢測(cè)了2014-05-05
JS實(shí)現(xiàn)獲取進(jìn)今年第幾天是周幾的方法分析
這篇文章主要介紹了JS實(shí)現(xiàn)獲取進(jìn)今年第幾天是周幾的方法,結(jié)合實(shí)例形式對(duì)比分析了JavaScript進(jìn)行日期與天數(shù)運(yùn)算相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06
怎樣用Javascript實(shí)現(xiàn)建造者模式
這篇文章主要介紹了怎樣用Javascript實(shí)現(xiàn)建造者模式,想學(xué)習(xí)設(shè)計(jì)模式的同學(xué),可以參考下2021-04-04
javascript下查找父節(jié)點(diǎn)的簡(jiǎn)單方法
javascript下查找父節(jié)點(diǎn)的簡(jiǎn)單方法...2007-08-08
js的新生代垃圾回收知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于js的新生代垃圾回收的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2019-08-08
layui table 列寬百分比顯示的實(shí)現(xiàn)方法
今天小編就為大家分享一篇layui table 列寬百分比顯示的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
js實(shí)現(xiàn)文字跟隨鼠標(biāo)移動(dòng)而移動(dòng)的方法
這篇文章主要介紹了js實(shí)現(xiàn)文字跟隨鼠標(biāo)移動(dòng)而移動(dòng)的方法,實(shí)例分析了javascript處理鼠標(biāo)事件及文字特效的技巧,需要的朋友可以參考下2015-02-02

