亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

更好理解的面向?qū)ο蟮腏avascript 1 —— 動態(tài)類型和多態(tài)

shusen / 2851人閱讀

摘要:動態(tài)類型語言和鴨子類型編程語言按照數(shù)據(jù)類型大體可分為靜態(tài)類型語言和動態(tài)類型語言。鴨子類型的概念至關(guān)重要,比如一個對象有了屬性,也可以依照下標(biāo)來存取屬性,這個對象就可以被當(dāng)做數(shù)組來使用。

前言

曾經(jīng)對Javascript的面向?qū)ο笙嚓P(guān)知識也有過了解,從各種博客、書籍上也學(xué)到了很多。但是最近在看《Javascript設(shè)計模式與開發(fā)實戰(zhàn)》這本書時發(fā)現(xiàn)該書對這方面的知識點介紹的很易于理解,因此總結(jié)出該文章分享給大家,同時也作為自己日后復(fù)習(xí)的筆記。

動態(tài)類型語言和鴨子類型

編程語言按照數(shù)據(jù)類型大體可分為靜態(tài)類型語言和動態(tài)類型語言。
靜態(tài)類型語言就是指在編譯時就已經(jīng)確定了變量的類型,比如C++在聲明變量時的int關(guān)鍵字。
動態(tài)類型語言的變量類型要在程序運行時被賦值后才能確定。
在Javascript中,我們在對一個變量賦值時,顯然不需要考慮它的類型。因此,Javascript是一門經(jīng)典的動態(tài)類型語言。

動態(tài)類型語言在實際編碼時帶來了很大的靈活性,我們可以嘗試調(diào)用任意對象的任意方法,而不需要考慮它原本是否被設(shè)計擁有該方法。
這些都建立在鴨子類型的概念上,通俗的說法是“如果它走起路來像鴨子,叫起來也是鴨子,那么它就是鴨子?!?br>好吧我知道你可能不太理解,我們可以通過一個故事來深入理解:

從前在Javascript王國里,有一個國王,他覺得世界上最美妙的聲音就是鴨子的叫聲,于是國王召集大臣,要組建一個100只鴨子組成的合唱團(tuán)。但是大臣們找遍了全國,只找到了999只鴨子,最后大臣發(fā)現(xiàn)有一只非常特別的雞,它的叫聲跟鴨子一模一樣,于是這只雞就成為了合唱團(tuán)的最后一員。

這個故事說明,國王只是想要鴨子的叫聲,但它的主人是雞還是鴨都不重要。我們只關(guān)注對象的行為,而不關(guān)注對象本身
通過代碼你可能能更好的的理解:

let duck = {
  duckSay: function () {
    console.log("ga")
  }
}

let chicken = {
  duckSay: function () {
    console.log("ga")
  }
}

// 合唱團(tuán)
let choir = []

let joinChoir = function (animal) {
  if (animal && typeof animal.duckSay === "function") {
    choir.push(animal)
    console.log("加入合唱團(tuán)成功")
  }
}

joinChoir(duck)  // 加入合唱團(tuán)成功
joinChoir(chicken)  // 加入合唱團(tuán)成功

我們發(fā)現(xiàn),只要動物擁有duckSay方法,它就可以加入合唱團(tuán),而并不關(guān)心它到底是誰。
鴨子類型的概念至關(guān)重要,比如一個對象有了length屬性,也可以依照下標(biāo)來存取屬性,這個對象就可以被當(dāng)做數(shù)組來使用。(這里可以思考我們在處理函數(shù)傳入的參數(shù)arguments時的一些操作)

多態(tài)

多態(tài)是指同一操作作用于不同的對象上面,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果。也就是給不同對象發(fā)送同一消息,會有不同的反饋。
這里我們依舊通過一個故事來講解:

主人家里養(yǎng)了兩只動物,一只雞和一只鴨,當(dāng)主人發(fā)出叫的命令時,鴨會gagaga的叫,而雞會gegege的叫。

上面的故事用代碼實現(xiàn)就是:

let makeSound = function (animal) {
  if (animal instanceof Duck) {
    console.log("ga")
  } else if (animal instanceof Chicken) {
    console.log("ge")
  }
}

let Duck = function () {}
let Chicken = function () {}

makeSound(new Duck())  // ga
makeSound(new Chicken())  // ge

多態(tài)背后的思想是將“做什么”和“誰去做以及怎樣去做”分離開,即將“不變的事情”和“可變的事情”分離開。這樣的程序是可生長的,也是符合開放-封閉原則。
因此我們可以將不變的部分隔離出來,也就是所有的動物都會叫

let makeSound = function (animal) {
  animal.sound()
}

然后把可變的部分封裝起來:

let Duck = function () {}
Duck.prototype.sound = function () {
  console.log("ga")
}

let Chicken = function () {}
Chicken.prototype.sound = function () {
  console.log("ge")
}

makeSound(new Duck())  // ga
makeSound(new Chicken())  // ge

再比如我們要開發(fā)一個地圖應(yīng)用,現(xiàn)在有百度和谷歌兩家地圖提供了API,且均提供了show()方法,代碼如下:

let googleMap = {
  show: function () {
    console.log("開始渲染谷歌地圖")
  }
}

let baiduMap = {
  show: function () {
    console.log("開始渲染百度地圖")
  }
}

let renderMap = function (type) {
  if (type === "google") {
    googleMap.show()
  } else if (type === "baidu") {
    baiduMap.show()
  }
}

renderMap("google")  // 開始渲染谷歌地圖
renderMap("baidu")  // 開始渲染百度地圖

可以看到,雖然renderMap()函數(shù)保持了一定的彈性,但是這種彈性很脆弱,如果再換另一個地圖,有需要修改renderMap函數(shù),繼續(xù)添加條件分支語句。
我們可以把程序相同的部分抽象出來,即顯示某個地圖:

let renderMap = function (map) {
  if (map.show instanceof Function) {
    map.show()
  }
}
結(jié)束語

希望能為你帶來一些啟發(fā)。

參考資料:
《JavaScript 設(shè)計模式與開發(fā)實戰(zhàn)》 第一章

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/100426.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對象”還好嗎?

    摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評論0 收藏0
  • JavaScript設(shè)計模式與開發(fā)實踐 | 01 - 面向對象JavaScript

    摘要:在中,并沒有對抽象類和接口的支持。例如,當(dāng)對象需要對象的能力時,可以有選擇地把對象的構(gòu)造器的原型指向?qū)ο螅瑥亩_(dá)到繼承的效果。本節(jié)內(nèi)容為設(shè)計模式與開發(fā)實踐第一章筆記。 動態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動態(tài)類型語言。 靜態(tài)類型語言在編譯時已確定變量類型,動態(tài)類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...

    suxier 評論0 收藏0
  • JavaScript面向對象三大特征

    摘要:什么是面向?qū)ο蟊疚牟辉谡撌觥=酉聛碚f一下面向?qū)ο蟮娜筇卣髟诋?dāng)中的實現(xiàn)。封裝實現(xiàn)封裝實現(xiàn)就是是對象內(nèi)部的變化對外界是透明的不可見。這種做法使對象之間低耦合便于維護(hù)升級團(tuán)隊協(xié)作開發(fā)。。 概述 本來打算寫設(shè)計模式的,在談?wù)搄s的設(shè)計模式之前先說一下js的面向?qū)ο?因為很多設(shè)計模式的實現(xiàn)都摻雜著面向?qū)ο蟮乃枷?所以先做一下前期鋪墊。 js我們都知道是一種動態(tài)類型腳本型語言,變量類型無法保證,...

    chaosx110 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<