1. 程式人生 > >JavaScript設計模式基礎之面向對象的JavaScript(一)

JavaScript設計模式基礎之面向對象的JavaScript(一)

UNC 靈活 我們 靜態 type n) object 模式 string

動態語言類型與鴨子類型

此內容取自JavaScript設計模式與開發實踐一書

編程語言按照數據類型大體可以分為2類,一類就是靜態類型語言,另一類則是動態類型語言

靜態類型語言也可以稱之為編譯語言,而動態類型語言則稱可以之為解釋型語言

JavaScript則屬於動態類型語言他無需定義時候聲明類型給實際編碼帶來了極大的靈活性,且可以嘗試調用任何對象的任意方法,

而無需考慮它原本是否被設計為擁有該方法。

這其實也叫做鴨子類型 鴨子類型的定義為:如果它走起來像鴨子,叫起來也像鴨子,那麽它就是鴨子

舉個小例子:

  在一個動物王國中,國王覺得鴨子的聲音是最美妙的,於是他要建立一個有2000個鴨子的合唱團,但是大臣們找遍了王國

卻只能找到1999只鴨子始終是缺一只,最後一個大臣發現了一只特別的雞,它的叫聲和鴨子一模一樣,於是這只雞進入了合唱團

這個故事想要表達的意思是,國王要聽的是鴨子的聲音,但是這個聲音的主人是鴨子還是雞並不重要,哪怕它是條狗

下面上代碼模擬一下這個故事:

 

 let duck = {
            duckSinging(){
                console.log(嘎嘎嘎);
            }
        };
        let chicken = {
            duckSinging(){
                console.log(
嘎嘎嘎); } } let choir = [] //合唱團 let joinChoir = function(animal){ if(animal && Object.prototype.toString.call(animal.duckSinging) === [object Function]){ choir.push(animal); console.log(歡迎加入合唱團); console.log(`合唱團成員數量已有${choir.length}`); } } joinChoir(duck); joinChoir(chicken);

輸出:

技術分享圖片

在動態類型語言的面向對象設計中,鴨子類型概念至關重要,利用鴨子類型的思想,我們不比借用超類型就能輕松實現動態語言

中的一個原則:“面向接口編程” 而不是面向實現編程

列如:一個對象若有push和pop方法並且正確實現,那麽它就能當做棧來使用,如果有length屬性,也可以依照下標來取值這個對象就能當做數組使用

“面向接口編程”是設計模式中最重要是思想

JavaScript設計模式基礎之面向對象的JavaScript(一)