ES6 class和面向?qū)ο缶幊?/h1>

在ES5中刻像,我們經(jīng)常使用方法或者對象去模擬類的使用板甘,并基于原型實現(xiàn)繼承忽妒,雖然可以實現(xiàn)功能熄赡,但是代碼并不優(yōu)雅姜挺,很多人還是傾向于用 class 來組織代碼,很多類庫彼硫、框架創(chuàng)造了自己的 API 來實現(xiàn) class 的功能初家。
ES6 時代終于有了 class (類)語法,能讓我們可以用更簡明的語法實現(xiàn)繼承乌助,也使代碼的可讀性變得更高,同時為以后的JavaScript語言版本添加更多的面向?qū)ο筇卣鞔蛳禄A(chǔ)陌知。
一他托、 類的定義

  1. ES5使用函數(shù)模擬類
function Person( name , age ) {
    this.name = name;
    this.age = age;
}
Person.prototype.say = function(){
    return '我叫' + this.name + ',今年' + this.age + '歲';
}
var  p = new Person('xiaoming',33);  // Person {name: "xiaoming", age: 33}
p.say();

使用ES5語法定義了一個Person類,該類有name age food三個屬性和一個原型eat方法仆葡。

2.ES class定義類

class Person{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    say(){
        return '我叫' + this.name + ',今年' + this.age + '歲';
    }
}
var stu = new Person("xiaoming",22);
p.say();

上面代碼定義了一個同樣的Person類赏参,constructor方法就是構(gòu)造方法,而this關(guān)鍵字則代表實例對象;
注:雖然ES6引入了class關(guān)鍵字沿盅,但并沒有真的引入類這個概念把篓,通過class定義的仍然是函數(shù),數(shù)據(jù)類型中也沒有class類型腰涧。

console.log(typeof Person);//還是'function'

所以說韧掩,class僅僅是通過更簡單直觀的語法去實現(xiàn)原型鏈繼承。這種對語言功能沒有影響窖铡、但是給程序員帶來方便的新語法疗锐,被稱為語法糖。

二费彼、類的傳參
在類的參數(shù)傳遞中,我們在constructor( )進(jìn)行傳參滑臊,傳遞參數(shù)后可以直接使用this.xxx進(jìn)行調(diào)用。

class Person{
    constructor(x,y){
        this.x = x;
        this.y = y;
    }
    add(){
        return this.a + this.b;
    }
}
let stu = new Person(11,22);
stu.add();//11+22=33

用constructor來傳遞參數(shù)箍铲,然后用了一個add方法雇卷,把參數(shù)相加。

三、靜態(tài)方法

  1. 使用函數(shù)模擬類時关划,通過函數(shù)名.靜態(tài)方法名小染,來定義靜態(tài)方法:
function Person(name,age){
    this.name = name;
    this.age = age;
    Person.say = function(){
        return "I can say!"
    }
}
Person.say();//I can say!
var student = new Person("xiaoming",11);
student.say();//報錯

靜態(tài)方法是不需要實例化祭玉,可以通過類名直接調(diào)用氧映,注意的是靜態(tài)方法不會繼承到類實例中,因此靜態(tài)方法經(jīng)常用來作為工具函數(shù)脱货。比如我們經(jīng)常用的Math.random()岛都。

  1. 在ES6 class類定義中,可以使用static關(guān)鍵字定義靜態(tài)方法:
class A{
    constructor(){};
    static say(){
        console.log("I can say!");
    }
}
A.say();//I can say
var a = new A();
a.say()//error

跟之前一樣振峻,通過類名直接調(diào)用臼疫,不會繼承到類實例中。
static關(guān)鍵字是ES6的另一個語法糖扣孟,static 使靜態(tài)方法聲明也成為了一個一等公民烫堤。

四、封裝和繼承

  1. ES6之前子類對象是通過使用原型來實現(xiàn)繼承父類凤价,子類函數(shù)和父類函數(shù)共享原型的形式來實現(xiàn):
function Person(name,age){
    this.name = name;
    this.age = age;
}
function father(name,age,firstname,lastname){
    Person.call(this,name,age);//通過call來繼承父類的方法來實現(xiàn)自己的功能
    this.lastname = lastname;
    this.firstname = firstname;
}
console.log(new father('zhangsan',11,'zhang','san'));
//father {name: "zhangsan", age: 11, lastname: "san", firstname: "zhang"}
function son(name,age,firstname,lastname){
    father.call(this,name,age,firstname,lastname);
};
son.prototype = Object.create(father.prototype);
son.constructor = son;
console.log(new son('zhangsi',5,'zhang','si'));
//son {name: "zhangsi", age: 5, lastname: "si", firstname: "zhang"}
  1. ES6中新的extends關(guān)鍵字解決了這個麻煩問題:
語法:class son extends father{}

下面定義了一個Child類鸽斟,該類通過extends關(guān)鍵字,繼承了Parent類的所有屬性和方法利诺。

class Parent{
    constructor(firstname,lastname){
        this.firstname = firstname;
        this.lastname = lastname;
    }
}
class Child extends Parent{
    constructor (firstname,lastname,name){
        super(firstname,lastname);
        this.name = name;
    }
    say(){
        console.log("I can say!")
    }
}
console.log(new Child("蒙奇","D","路飛"));
//Child {firstname: "蒙奇", lastname: "D", name: "路飛"}
  1. super關(guān)鍵字
    super表示超富蓄,超類,父類慢逾。既可以當(dāng)作函數(shù)立倍,也可以當(dāng)作對象使用。
    (1)super作為函數(shù)調(diào)用侣滩,代表父類的構(gòu)造函數(shù)口注。
    注意,ES6中規(guī)定君珠,子類的構(gòu)造函數(shù)必須執(zhí)行一次super函數(shù)寝志。格式:
class Parent{}
class Child extends Parent{
    constructor (){
        super();
        // ...
    }
    // ...
}  
class Parent{}
class Child extends Parent{
    constructor (){
        // super();  如果調(diào)用super,程序會報錯Uncaught ReferenceError: this is not defined
        // ...
    }
    // ...
}
new Child();

注意,super雖然代表父類中的構(gòu)造函數(shù)葛躏,但是返回的是子類的實例澈段,即super內(nèi)部的this指的是子類Child,在這種情況下舰攒,super()相當(dāng)于Parent.prototype.constructor.call(this)败富。
(2)super作為對象,代表父類的原型對象摩窃。

class Parent{
    constructor(firstname,lastname,age){
        this.firstname = firstname;
        this.lastname = lastname;
        this.age = age;
    }
    say(){
        console.log("I can say.");
    }
}
class Child extends Parent{
    constructor (firstname,lastname,age,score){
        super(firstname,lastname,age); //super在這里代表父類的構(gòu)造函數(shù) 
        this.score = score;
        super.say();//super在這里代表父類的原型對象兽叮,可以調(diào)用父類的方法
    }
    
}

console.log(new Child("蒙奇","路飛",18,100));
// I can say.
// {firstname: "蒙奇", lastname: "路飛", age: 18, score: 100}

使用extends關(guān)鍵字實現(xiàn)繼承芬骄,那么子類中可以通過super關(guān)鍵字調(diào)用父類的東西
(3)4.3 getter(取值)、 setter(存值)
與 ES5 一樣鹦聪,在“類”的內(nèi)部可以使用get和set账阻,對某個屬性設(shè)置存值函數(shù)和取值函數(shù),攔截該屬性的存取行為泽本。

class Parent{
    constructor(){}
    get firstname(){
        return "D.";
    }
    set lastname(value){
        console.log('我的名是:' + value);
    }
}

let p = new Parent();
console.log(p.firstname);//D.
console.log(p.lastname = "路飛")  ;
//我的名是:路飛
//路飛

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末淘太,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子规丽,更是在濱河造成了極大的恐慌蒲牧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赌莺,死亡現(xiàn)場離奇詭異冰抢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)艘狭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門挎扰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巢音,你說我怎么就攤上這事遵倦。” “怎么了官撼?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵骇吭,是天一觀的道長。 經(jīng)常有香客問我歧寺,道長,這世上最難降的妖魔是什么棘脐? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任斜筐,我火速辦了婚禮,結(jié)果婚禮上蛀缝,老公的妹妹穿的比我還像新娘顷链。我一直安慰自己,他們只是感情好屈梁,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布嗤练。 她就那樣靜靜地躺著,像睡著了一般在讶。 火紅的嫁衣襯著肌膚如雪煞抬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天构哺,我揣著相機(jī)與錄音革答,去河邊找鬼战坤。 笑死,一個胖子當(dāng)著我的面吹牛残拐,可吹牛的內(nèi)容都是我干的途茫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼溪食,長吁一口氣:“原來是場噩夢啊……” “哼囊卜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起错沃,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤栅组,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捎废,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笑窜,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年登疗,在試婚紗的時候發(fā)現(xiàn)自己被綠了排截。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡辐益,死狀恐怖断傲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情智政,我是刑警寧澤认罩,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站续捂,受9級特大地震影響垦垂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牙瓢,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一劫拗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矾克,春花似錦页慷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至控妻,卻和暖如春州袒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弓候。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工稳析, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留洗做,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓彰居,卻偏偏與公主長得像诚纸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陈惰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容