国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript設計模式與開發實踐(一)- 多態

wthee / 3485人閱讀

摘要:當我們對一些函數發出調用的消息時,這些函數會返回不同的執行結果,這是多態性的一種體現,也是很多設計模式在中可以用高階函數來代替實現的原因。

PS:上一篇文章發表之后,很多朋友關注了本人的思否和掘金的博客,雖然關注的朋友還有有限,但足夠讓我把自己在技術上的問題積累分享給大家,也希望大家能夠喜歡,同時能動一動手指,給一顆心(贊),博主會持續更新下去 多態

本文是《javascript設計模式與開發實踐》一書學習筆記,因書中所表述的概念簡單明了,故將整本書的筆記奉上,全部文章大概在20篇左右,還請朋友們持續關注

動態語言類型

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

靜態類型語言,聲明任何變量或者形參都需要指定類型,例如java語言。
動態類型語言,聲明任何變量或者形參都不需要指定類型,javascript就是動態類型語言。

所謂動態,可以多層面的理解,首先,聲明變量不需要指定類型,其次,在多態思想下,java中需要利用父類實現多態,而javascript就不需要,本身自帶多態屬性。

多態

熟悉java的朋友知道,java三大特征之一就有多態,多態給java帶來了很大的靈活性,很多設計模式也是通過多態來實現,java中的多態涉及到向上轉型和向下轉型,而javascript(以下簡稱js)的"多態"就相對來說容易實現

我們來看一段“多態”的js代碼

var makeSound = function(an) {
    if(an instanceof Duck) {
        console.log("嘎嘎嘎");
    } else if(an instanceof Dog) {
        console.log("汪汪汪");
    }
}

var Dog = function(){};
var Duck = function(){};

makeSound(new Dog());
makeSound(new Duck());

這段代碼確實體現了“多態性”,當我們分別向鴨和雞發出“叫喚”的消息時,它們根據此 消息作出了各自不同的反應,但是這樣寫會有一個弊端,當更多的類型出現時,我們要不斷的修改makeSound函數,后期makeSound函數也會變得十分巨大,這不符合良好代碼設計的規范,多態背后的思想是將“做什么”和“誰去做以及怎樣去做”分離開來,也就是將“不變的事 物”與 “可能改變的事物”分離開來。在這個故事中,動物都會叫,這是不變的,但是不同類 型的動物具體怎么叫是可變的。把不變的部分隔離出來,把可變的部分封裝起來,這給予了我們 擴展程序的能力,程序看起來是可生長的,也是符合開放—封閉原則的,相對于修改代碼來說, 僅僅增加代碼就能完成同樣的功能,這顯然優雅和安全得多

首先,我們把makeSound函數修改一下:

var makeSound = function(an) {
    an.speak();
}

這段代碼傳入一個對象,然后調用對象的speak函數

var Duck = function(){}
Duck.prototype.sound = function(){
    console.log( "嘎嘎嘎" );
};
var Chicken = function(){}
Chicken.prototype.sound = function(){
    console.log( "咯咯咯" );
};
makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() );

現在我們向鴨和雞都發出“叫喚”的消息,它們接到消息后分別作出了不同的反應。如果有 一天動物世界里又增加了一只狗,這時候只要簡單地追加一些代碼就可以了,而不用改動以前的 makeSound 函數

類型檢查和多態

現在,我們來進一步了解多態,之前說到,java的多態需要利用繼承來實現,我們現在把動物的例子換成java代碼

public class Duck {
    public void speak(){
        System.out.println( "嘎嘎嘎" );
    }
}

public class Dog {
    public void speak(){
        System.out.println( "汪汪汪" );
    }
}

public class AnimalSpeak{
    public void makeSound(Duck duck){
        duck.speak();
    }
}

public static void main(String args[]){
    AnimalSpeak an = new AnimalSpeak();
    Duck duck = new Duck();
    an.makeSound(duck); // 輸出:嘎嘎嘎
}

現在鴨子已經順利叫出來了,但是我們想讓狗也叫,發現不太容易實現,因為makeSound函數中,形參是Duck類型,傳入Dog類型一定會報錯,這個時候繼承就出現了,java設計思路是我先創建一個父類,具體傳入的類型由子類決定,但是makeSound函數中的形參確是父類類型,實現如下:

public abstract class Animal{
    abstract void speak(); // 抽象方法
}

public class Duck extends Animal {
    public void speak(){ // 覆寫父類中的抽象方法
        System.out.println( "嘎嘎嘎" );
    }
}

public class Dog extends Animal {
    public void speak(){ // 覆寫父類中的抽象方法
        System.out.println( "汪汪汪" );
    }
}

public class AnimalSpeak{
    public void makeSound(Animal an){
        an.speak();
    }
}

public static void main(String args[]){
    AnimalSpeak an = new AnimalSpeak();
    Animal duck = new Duck();
    Animal dog = new Dog();
    an.makeSound(duck); // 輸出:嘎嘎嘎
    an.makeSound(dog); // 輸出:汪汪汪
}
js中的多態

JavaScript 對象的多態性是與生俱來的,為什么這么說? 仔細看看這兩個函數:

public void makeSound(Animal an){
    an.speak();
}

function(an) {
    an.speak();
}

js和java中的函數的形參是不同的,java定死了傳入的類型,而js是動態的,js隨便可以傳入任何類型,所以,我們之前說js是動態類型語言,在 JavaScript 這種將函數作為一等對象的語言中,函數本身也是對象,函數用來封裝行為并 且能夠被四處傳遞。當我們對一些函數發出“調用”的消息時,這些函數會返回不同的執行結 果,這是“多態性”的一種體現,也是很多設計模式在 JavaScript 中可以用高階函數來代替實現的原因。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93132.html

相關文章

  • JavaScript設計模式開發實踐 | 01 - 面向對象的JavaScript

    摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構造器的原型指向對象,從而達到繼承的效果。本節內容為設計模式與開發實踐第一章筆記。 動態類型語言 編程語言按數據類型大體可以分為兩類:靜態類型語言與動態類型語言。 靜態類型語言在編譯時已確定變量類型,動態類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...

    suxier 評論0 收藏0
  • 學習設計模式前需要知道的事情

    摘要:為什么要學習設計模式做事情之前問個為什么總是好的。設計模式的使用方法關于使用方式,像我這種初學者最容易犯的錯誤就是生搬硬套,但是模仿本來也是學習的一個過程,最重要的事情是在模仿中要學會思考。 為什么要學習設計模式? 做事情之前問個為什么總是好的。關于設計模式的好壞,我在知乎上也看過一些討論,有知友對其提出過一些疑問,里面有一些關于設計模式的觀點: 設計模式有何不妥,所謂的荼毒體現在哪...

    kviccn 評論0 收藏0
  • javascript面向對象之“多態

    摘要:之前,本質上不能算是一門面向對象的編程語言,因為它對于封裝繼承多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。所以在中出現了等關鍵字,解決了面向對象中出現了問題。 ES6之前,javascript本質上不能算是一門面向對象的編程語言,因為它對于封裝、繼承、多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...

    JerryWangSAP 評論0 收藏0
  • JavaScript多態適配器模式思考

    摘要:下面是我仿照適配器模式改進的谷歌地圖百度地圖適配器參數配置適配器地圖只關注發出顯示地圖而不關注具體用哪種地圖當增加了搜搜地圖,我們需要添加搜搜地圖的方法以及修改適配器地圖參數而不需要對函數進行修改搜搜地圖 不多說先上一段代碼(轉載自《JavaScript設計模式與開發實踐》) //谷歌地圖show方法 var googleMap = { ...

    binta 評論0 收藏0
  • JavaScript設計模式開發實踐》 —— <閱讀小札·>

    摘要:閱讀小札一閱讀前自大學課上,就開始接觸設計模式,但對設計模式卻鮮有研究與實踐。第二部分是核心部分,由淺到深講解個設計模式。設計模式遵循的原則所有設計模式罪訓的一條原則就是找出程序中變化的地方,并將變化封裝起來。 閱讀小札 · 閱讀前 自大學Java課上,就開始接觸設計模式,但對設計模式卻鮮有研究與實踐。最近向公司反映和游說技術提升,得以獲得公司提供購書機會,借此認真學習前端學習之路的...

    Yangder 評論0 收藏0

發表評論

0條評論

wthee

|高級講師

TA的文章

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