javascript
JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态
一、認(rèn)識class定義類
我們會發(fā)現(xiàn),按照前面的構(gòu)造函數(shù)形式創(chuàng)建 類,不僅僅和編寫普通的函數(shù)過于相似,而且代碼并不容易理解。
- 在ES6(ECMAScript2015)新的標(biāo)準(zhǔn)中使用了class關(guān)鍵字來直接定義類;
- 但是類本質(zhì)上依然是前面所講的構(gòu)造函數(shù)、原型鏈的語法糖而已;
- 所以學(xué)好了前面的構(gòu)造函數(shù)、原型鏈更有利于我們理解類的概念和繼承關(guān)系;
那么,如何使用class來定義一個類呢?
- 可以使用兩種方式來聲明類:類聲明和類表達(dá)式;
二、類和構(gòu)造函數(shù)的異同
我們來研究一下類的一些特性:
- 你會發(fā)現(xiàn)它和我們的構(gòu)造函數(shù)的特性其實(shí)是一致的;
三、類的構(gòu)造函數(shù)
如果我們希望在創(chuàng)建對象的時候給類傳遞一些參數(shù),這個時候應(yīng)該如何做呢?
- 每個類都可以有一個自己的構(gòu)造函數(shù)(方法),這個方法的名稱是固定的constructor;
- 當(dāng)我們通過new操作符,操作一個類的時候會調(diào)用這個類的構(gòu)造函數(shù)constructor;
- 每個類只能有一個構(gòu)造函數(shù),如果包含多個構(gòu)造函數(shù),那么會拋出異常;
當(dāng)我們通過new關(guān)鍵字操作類的時候,會調(diào)用這個constructor函數(shù),并且執(zhí)行如下操作:
四、類的實(shí)例方法
在上面我們定義的屬性都是直接放到了this上,也就意味著它是放到了創(chuàng)建出來的新對象中:
-
在前面我們說過對于實(shí)例的方法,我們是希望放到原型上的,這樣可以被多個實(shí)例來共享:
-
但是在類中,我們可以直接在類中定義;
五、類的訪問器方法
我們之前講對象的屬性描述符時有講過對象可以添加setter和getter函數(shù)的,那么類也是可以的:
六、類的靜態(tài)方法
靜態(tài)方法通常用于定義直接使用類來執(zhí)行的方法,不需要有類的實(shí)例,使用static關(guān)鍵字來定義:
七、ES6類的繼承 - extends
前面我們花了很大的篇幅討論了在ES5中實(shí)現(xiàn)繼承的方案,雖然最終實(shí)現(xiàn)了相對滿意的繼承機(jī)制,但是過程卻依然是非常繁瑣的。
- 在ES6中新增了使用extends關(guān)鍵字,可以方便的幫助我們實(shí)現(xiàn)繼承
八、super關(guān)鍵字
我們會發(fā)現(xiàn)在上面的代碼中我使用了一個super關(guān)鍵字,這個super關(guān)鍵字有不同的使用方式:
- 注意:在子(派生)類的構(gòu)造函數(shù)中使用this或者返回默認(rèn)對象之前,必須先通過super調(diào)用父類的構(gòu)造函數(shù)!
- super的使用位置有三個:子類的構(gòu)造函數(shù)、實(shí)例方法、靜態(tài)方法;
super在子類的構(gòu)造函數(shù)使用:
super在實(shí)例方法中使用
super在靜態(tài)方法中使用
原型繼承關(guān)系圖:
子類對父類方法的重寫:
九、繼承內(nèi)置類
我們也可以讓我們的類繼承自內(nèi)置類,比如Array:
十、類的混入mixin
JavaScript的類只支持單繼承:也就是只能有一個父類
- 那么在開發(fā)中我們我們需要在一個類中添加更多相似的功能時,應(yīng)該如何來做呢?
- 這個時候我們可以使用混入(mixin);
在react中的高階組件
十一、JavaScript中的多態(tài)
面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)。
- 前面兩個我們都已經(jīng)詳細(xì)解析過了,接下來我們討論一下JavaScript的多態(tài)。
JavaScript有多態(tài)嗎?
- 維基百科對多態(tài)的定義:多態(tài)(英語:polymorphism)指為不同數(shù)據(jù)類型的實(shí)體提供統(tǒng)一的接口,或使用一個單一的符號來表示多個不同的類型。
- 非常的抽象,個人的總結(jié):不同的數(shù)據(jù)類型進(jìn)行同一個操作,表現(xiàn)出不同的行為,就是多態(tài)的體現(xiàn)。
那么從上面的定義來看,JavaScript是一定存在多態(tài)的
總結(jié)
以上是生活随笔為你收集整理的JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四、Vue组件化开发学习笔记——父子组件
- 下一篇: JS面向对象——Object对象的方法补