摘要:要注意的是,如果要重寫構(gòu)造函數(shù),必須要在構(gòu)造函數(shù)的第一行調(diào)用父類的構(gòu)造函數(shù),在而在其他地方,則可以通過或者調(diào)用父級的變量或者方法
0x000 概述
es6真正的引入的面相對象的類,以前我們總是通過其他手段來模擬類這種形式,現(xiàn)在終于有了,我有點開心,又有點難過,因為在我看來,js并不是所謂的面相對象的語言,反而更偏向函數(shù)式,原型繼承是他真正的面目。面相對象不過是人們在思考問題時總結(jié)出一套有效的、大家都認同的解決問題的思路。在其他語言、各種領(lǐng)域取得成功之后,又將這種思想帶入js中,為的是將已有的經(jīng)驗可以復(fù)用到js,從而更有效的解決js中的問題。
的確,面相對象是一個很有用的思考模塊,在分解真實世界、大型項目的維護上有很大的好處,但是卻缺少了函數(shù)式的靈巧。曾經(jīng)想用完全面向?qū)ο蟮姆绞綄懸粋€redux,卻發(fā)現(xiàn)無法用這種方式寫出compose這種神奇的東西。
或許是我還沒能在面相對象和函數(shù)式之間取得一種平衡,以取得面相對象和函數(shù)式共同的優(yōu)點。
0x001 類
普通的類
class Person{}
類表達式
// 匿名類 let Person=class{} // 具名類 let Person=class Person{}0x001 初始化類和構(gòu)造函數(shù)
實例化類
可以使用new來調(diào)用一個類,從而實例化一個類實例
class Person{} new Person() // Person{}
構(gòu)造函數(shù)
使用new實例化一個類實例之后,將會自動調(diào)用該類的構(gòu)造函數(shù)constructor,并且可以傳遞參數(shù)
class Person{ constructor(name, age){ console.log(name, age) } } new Person("jack", 23) // "jack", 23
類變量
類中可以保存一些變量,在類中,可以通過this.variable_name來訪問,在類外,可以通過instance_name.variable_name只有類實例可以訪問他們,并且每個類實例的變量都是屬于每個類實例的。
class Person { constructor(nickname, age){ this.nickname = nickname this.age = age } } console.log(Person.nickname) // undefined console.log(Person.age) // undefined let person=new Person("jack",23) console.log(person.nickname) // "jack" console.log(person.age) // 23 let person2=new Person("maria",11) console.log(person2.nickname) // "maria" console.log(person2.age) // 11
類方法
類方法是定義在類內(nèi)部的函數(shù),可以在類內(nèi)部調(diào)用:this.function_name(params),也可以在實例上調(diào)用:instance_name.function_name(params)
class Person{ constructor(nickname, age){ this.nickname = nickname this.age =age } getNickname(){ return this.nickname } getAge(){ return this.age } summary(){ return `${this.nickname}:${this.age}` } } let person=new Person("jack", 23) console.log(person.getNickname()) // ""jack console.log(person.getAge()) // 23 console.log(person.summary()) // "jack:23"
靜態(tài)方法
靜態(tài)方法是可以通過類直接調(diào)用的方法,不需要實例化
class Person{ static sayHello(){ console.log("hello") } } Person.sayHello() // "hello"繼承
繼承就是將父類所有的方法和都繼承下來,包括構(gòu)造函數(shù)
class Person{ constructor(nickname, age){ this.nickname = nickname this.age =age } getNickname(){ return this.nickname } getAge(){ return this.age } summary(){ return "this is Person" } } class Male extends Person {} let male=new Male("jack",23) console.log(male.nickname) // "jack" console.log(male.age) // 23 console.log(male.getNickname()) // "jack" console.log(male.getAge()) // 23 console.log(male.summary()) // "this is Person"0x003 重寫
有時候我們不希望一個函數(shù)的作用和父類一致,比如在上面的栗子中,male.summary()返回this is Person,不符合我們的逾期,我們希望返回this is Male,這個時候就可以用到重寫,只要寫一個和父類相同名字和函數(shù)就行了,甚至參數(shù)個數(shù)不一致也不影響
class Person{ constructor(nickname, age){ this.nickname = nickname this.age =age } getNickname(){ return this.nickname } getAge(){ return this.age } summary(){ return "this is Person" } } class Male extends Person { summary(){ return "this is Male" } } let male=new Male() console.log(male.summary()) // this is Male0x004 調(diào)用超類
有時候我們希望在父類的流程基礎(chǔ)上添加一些自己的邏輯,這個時候就可以用到調(diào)用超類。要注意的是,如果要重寫構(gòu)造函數(shù),必須要在構(gòu)造函數(shù)的第一行調(diào)用父類的構(gòu)造函數(shù)super(...params),在而在其他地方,則可以通過super.variable_name或者super.function_name(params)調(diào)用父級的變量或者方法
class Person{ constructor(nickname, age){ this.nickname = nickname this.age =age } getNickname(){ return this.nickname } getAge(){ return this.age } summary(){ return "this is Person" } } class Male extends Person { constructor(nickname, age){ super(nickname, age) this.sex="male" } getSex(){ return this.sex } summary(){ return super.summary()+", and this is Male" } } let male=new Male() console.log(male.sex) // male console.log(male.summary) //this is Person, and this is Male
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/108594.html
重寫和隱藏方法 實例方法 子類中的實例方法的簽名(名稱,加上其參數(shù)的數(shù)量和類型)和返回類型與超類中的實例方法相同,將覆蓋超類的方法。 子類覆蓋方法的能力允許類從行為足夠接近的超類繼承,然后根據(jù)需要修改行為,重寫方法與它重寫的方法具有相同的名稱、數(shù)量和參數(shù)類型,以及返回類型。重寫方法還可以返回由被重寫方法返回的類型的子類型,此子類型稱為協(xié)變返回類型。 覆蓋方法時,你可能希望使用@Override注解...
摘要:使用抽象基類顯示表示接口如果類的作用是定義接口,應(yīng)該將其明確定義為抽象基類。此外,抽象基類可以作為其他類的唯一基類,混入類則決不能作為唯一的基類,除非這個混入類繼承了另一個更具體的混入這種做法非常少見。 《流暢的Python》筆記本篇是面向?qū)ο髴T用方法的第五篇,我們將繼續(xù)討論繼承,重點說明兩個方面:繼承內(nèi)置類型時的問題以及多重繼承。概念比較多,較為枯燥。 1. 繼承內(nèi)置類型 內(nèi)置類型...
繼承 在前面的課程中,你已經(jīng)多次看到了繼承,在Java語言中,類可以從其他類派生,從而從這些類繼承字段和方法。 定義:從另一個類派生的類稱為子類(也是派生類,擴展類或子類),派生子類的類稱為超類(也是基類或父類)。 除了Object沒有超類,每個類都有一個且只有一個直接超類(單繼承),在沒有任何其他顯式超類的情況下,每個類都隱式地是Object的子類。 類可以從派生自類的類派生的類派生,依此類推,...
摘要:構(gòu)造函數(shù)創(chuàng)建對象為了能夠判斷實例與對象的關(guān)系,我們就使用構(gòu)造函數(shù)來搞定。像和這樣的原生構(gòu)造函數(shù),在運行時自動出現(xiàn)在執(zhí)行環(huán)境中。 大綱: 一、理解對象 1.1 屬性類型 1.2 屬性方法 二、創(chuàng)建對象 2.1 簡單方式創(chuàng)建 2.2 工廠模式 2.3 構(gòu)造函數(shù) 2.4 原型 三、繼承 3.1 原型鏈 3.2 借用構(gòu)造函數(shù) 3.3 組合繼承(原型鏈+借用構(gòu)造函數(shù)) 3....
摘要:如果需要支持類的動態(tài)加載或需要對編譯后的字節(jié)碼文件進行解密操作等,就需要與類加載器打交道了。雙親委派模型,雙親委派模型,約定類加載器的加載機制。任何之類的字節(jié)碼都無法調(diào)用方法,因為該方法只能在類加載的過程中由調(diào)用。 jvm系列 垃圾回收基礎(chǔ) JVM的編譯策略 GC的三大基礎(chǔ)算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的card table數(shù)據(jù)...
閱讀 1917·2021-11-23 09:51
閱讀 1246·2019-08-30 15:55
閱讀 1613·2019-08-30 15:44
閱讀 759·2019-08-30 14:11
閱讀 1146·2019-08-30 14:10
閱讀 915·2019-08-30 13:52
閱讀 2630·2019-08-30 12:50
閱讀 615·2019-08-29 15:04