JavaScript的面向?qū)ο?/h1>

閱讀說明:本文檔默認已有ES5相關(guān)基礎(chǔ)知識咧虎,包括構(gòu)造函數(shù)妻献、原型晚碾、繼承等

1.什么是面向?qū)ο?/h4>
  • 面向過程POP VS 面向?qū)ο驩OP

    <font color="#f00">面向過程</font>:分析出解決問題需要的步驟糯耍,然后用函數(shù)把這些步驟一步步實現(xiàn)扔字,使用的時候再依次調(diào)用。

? <font color="#f00">面向?qū)ο?lt;/font>:把事務分解成一個個對象温技,然后由對象之間分工與合作革为。

? 例:把大象關(guān)進冰箱,分別用面向過程和面向?qū)ο髞砻枋觯?/em>

? 面向過程:1. 打開冰箱

? 2. 大象放進去

? 3. 關(guān)上冰箱

? 面向?qū)ο螅合日页鲇心男ο蠖媪郏@些對象有哪些功能震檩?

? 1. 大象對象(進去)

? 2. 冰箱對象(打開、關(guān)上)

? 3. 使用大象和冰箱的功能

  • 面向?qū)ο?/strong>

    特性:封裝性 繼承性 多態(tài)性

    優(yōu)點:易復用蜓堕,易維護抛虏,易擴展

    缺點:沒有面向過程性能高(面向過程適合和硬件聯(lián)系緊密的東西,比如單片機)

    總結(jié)&比喻:蛋炒飯--面向過程 | 蓋澆飯--面向?qū)ο?/p>

2.類和對象

面向?qū)ο罂梢孕稳莠F(xiàn)實世界的事物套才,事物分為具體的和抽象的兩種迂猴,比如手機這是抽象的概念,但我手中的這個iphone 11就是具體的一部手機背伴,是具體的概念沸毁。

面向?qū)ο蟮乃季S:

  1. 抽确逅琛(抽象)對象共用的屬性和行為組織(封裝)成一個<font color="#f00">類</font>(模板)
  2. 對類進行實例化,獲取類的對象
  • 對象和類的含義

    在JavaScript中息尺,對象是一組無序的相關(guān)屬性和方法的集合携兵,所有事物都是對象。例如:字符串掷倔、數(shù)值眉孩、數(shù)組、函數(shù)等勒葱。

    ES6新增了一個概念類,使用class聲明巴柿,之后以這個類實例化對象凛虽。類抽象了對象的公共部分,泛指某一大類广恢。

3. class創(chuàng)建自定義類

如果不熟悉ES5的構(gòu)造函數(shù)概念的凯旋,建議先熟悉構(gòu)造函數(shù)以及對象的原型、繼承等知識钉迷,參考經(jīng)典紅寶書至非,這樣學習ES6中類的概念,會容易些糠聪。

類的創(chuàng)建和實例化:

class Star {
  // 構(gòu)造函數(shù)荒椭,new創(chuàng)建對象時調(diào)用,可以接收傳遞過來的參數(shù),同時返回實例對象
  constructor(uname) {
    this.uname = uname
  }
  // 實例方法(相當于ES5中Star.prototype.say=function)
  say() {
    console.log(this.uname)
  }
}
// 參數(shù)會傳給constructor構(gòu)造函數(shù)
const xz = new Star("肖戰(zhàn)")
const cxk = new Star("蔡徐坤")
xz.say()
console.log(xz.uname, cxk.uname)

4.什么是繼承

先看一個簡單的繼承的例子:

// 父類
class Father {
  constructor(x, y) {
    this.x = x
    this.y = y
  }
  sum() {
    console.log(this.x + this.y)
  }
}

// 子類(通過extends關(guān)鍵字實現(xiàn)繼承舰蟆,繼承概念同ES5)
class Son extends Father {
  // constructor函數(shù)可以沒有趣惠,但如果定義了,則必須在使用this之前 調(diào)用super函數(shù)身害,否則報錯味悄,因為子類沒有自己的this對象,而是繼承父類的this
  constructor(x, y) {
    // 調(diào)用父類的構(gòu)造函數(shù)
    super(x, y)
  }
}
var son = new Son(100, 5)
son.sum()

上面這個例子塌鸯,如果子類Son沒有constructor函數(shù)侍瑟,最終結(jié)果也是一樣的。因為子類如果不指定構(gòu)造函數(shù)丙猬,會默認添加以下構(gòu)造函數(shù):

constructor(...args) {
  super(...args);
}

super關(guān)鍵字除了可以調(diào)用父類構(gòu)造函數(shù)涨颜,也能調(diào)用父類的普通方法:

class Father {
  say() {
      console.log("Father")
  }
}

class Son extends Father {
  say(){
    //   調(diào)用父類的方法
      super.say()
      console.log("Son")
  }
}
var son = new Son()
son.say()

繼承除了可以繼承父類中的方法,也可以擴展子類自己的方法淮悼,定義方式和類定義方法一樣咐低。

5.幾個注意點

  • 類沒有變量提升,所以使用自定義類創(chuàng)建實例化對象時袜腥,必須先聲明這個類

  • 類里面共有的屬性和方法加this使用

  • 注意this的指向:

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      </head>
      <body>
        <button id="test">click!</button>
      </body>
      <script>
        var that
        var click_that
        var say_that
        class Star {
          constructor(name) {
            that = this
            this.anme = name
            this.btn = document.getElementById("test")
            this.btn.onclick = this.clickBtn
          }
          clickBtn() {
            click_that = this
            console.log(this) // button
            console.log(this.name) //undefined 因為這里的this指向的是button對象见擦,不是實例化對象
          }
          say() {
            say_that = this
          }
        }
    
        var fa = new Star("肖戰(zhàn)")
        fa.say()
        console.log(that === fa) //true
        console.log(click_that === fa) //false
        console.log(say_that === fa) //true
      </script>
    </html>
    

    上述代碼比較簡單钉汗,分別是打印了構(gòu)造函數(shù)以及兩個實例方法里this的指向,總結(jié)下:

    constructor中的this指向的就是實例對象鲤屡,實例方法中的this指向损痰,記住一個原則,誰調(diào)用的就指向誰酒来。

    比如上例中的click是button調(diào)用的卢未,this指向this.btn,say方法是實例對象調(diào)用的堰汉,所以this指向?qū)嵗龑ο骹a辽社。

    我在github寫的一個關(guān)于面向?qū)ο蟮膶嵗?/a>,這個實例主要是一個tab翘鸭,包括刪除滴铅、添加、雙擊編輯功能就乓,采用的是面向?qū)ο蟮膶懛ā?/p>

  • 序言:七十年代末汉匙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子生蚁,更是在濱河造成了極大的恐慌噩翠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邦投,死亡現(xiàn)場離奇詭異伤锚,居然都是意外死亡,警方通過查閱死者的電腦和手機尼摹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門见芹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢涝,你說我怎么就攤上這事玄呛。” “怎么了和二?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵徘铝,是天一觀的道長。 經(jīng)常有香客問我惯吕,道長惕它,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任废登,我火速辦了婚禮淹魄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堡距。我一直安慰自己甲锡,他們只是感情好兆蕉,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缤沦,像睡著了一般虎韵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缸废,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天包蓝,我揣著相機與錄音,去河邊找鬼企量。 笑死测萎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的梁钾。 我是一名探鬼主播绳泉,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姆泻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冒嫡,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拇勃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孝凌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體方咆,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年蟀架,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓣赂。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工钩杰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纫塌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓讲弄,卻偏偏與公主長得像措左,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子避除,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356