javascript中有多態嗎
這篇“javascript中有多態嗎”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“javascript中有多態嗎”文章吧。
JavaScript中有多態;多態表示的是同一操作作用于不同的對象上面可以產生不同的解釋和不同的執行結果,JavaScript中的多態體現在子類中可直接實現同名函數即可覆蓋父類函數,JavaScript中的父類函數都可以直接覆蓋。
本教程操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。
javascript中有多態
含義
同一操作作用于不同的對象上面,可以產生不同的解釋和不同的執行結果
比方說,我養了一只貓和一只狗,我對它們發出同一個指令 “叫一下”,貓會喵喵喵,而狗會汪汪汪,所以讓它們叫一下就是同一操作,而叫聲不同則是不同的執行結果。
用偽代碼來實現就是這樣的:
function?getVoice(animals)?{ ????if(animals?instanceof?Cat){ ????????console.log('喵~'); ???????? ????} ????if(animals?instanceof?Dog){ ????????console.log('汪~'); ????} } class?Cat?{} class?Dog?{} getVoice(new?Cat());?//?'喵~' getVoice(new?Dog());?//?'汪~'
那么如果我們想增加一個動物呢?再多加一個判斷?那么之后我每次都想要加一個動物的叫聲就都要修改一次 getVoice?是不是有點繁瑣呢?
所以我們要想想如何解決這個問題~
對象的多態性
其實多態最根本的作用就是通過把過程化的條件語句轉化為對象的多態性,從而消除這些條件分支語句。
通俗一點來講,就是把 “做什么” 和 “誰去做以及怎么去做” 分離開,抽象概括就是把 “不變的事物” 和 “可能改變的事物” 分離開。
最開始我們舉的例子中就可以拆分理解成這樣:
不變的事物是:動物發出叫聲 可能改變的事物是:什么動物發出什么樣的叫聲
那我們就可以把 “動物發出叫聲” 這個動作分布到各個類上(封裝到各個類上),然后在發出叫聲的 getVoice 函數中調用"叫"這個動作就可以了。
上面這個例子就可以修改成這樣啦~
function?getVoice?(animals)?{ ????if?(animals.sound?instanceof?Function)?{ ????????//?判斷是否有animal.sound且該屬性為函數 ????????animals.sound(); ????} } class?Cat?{ ????sound?()?{ ????????console.log('喵~'); ????} } class?Dog?{ ????sound?()?{ ????????console.log('汪~'); ????} } getVoice(new?Cat());?//?'喵~' getVoice(new?Dog());?//?'汪~'
多態的實際應用
多態在設計模式中應用得比較廣泛,比如 組合模式 / 策略模式等等?!?/p>
雖然我們在平時的開發中不太用的到,但是一旦我們涉及到一些設計模式的話,多態還是很有用的
JS的封裝與多態
除了繼承,封裝與多態也是面向對象思想的組成部分。JS的封裝、多態也是通過屬性的靈活應用“模擬”實現的。
通過在類中設置公共屬性,并在子類中實現,就可以模擬封裝。
而多態的體現,則更為簡單,在子類中直接實現同名函數即可覆蓋(override)父類函數。JS中沒有類似C#中的virtualde 關鍵字,所有父類函數都可以直接覆蓋。
示例:
function?calc(value1,value2){ this.data1=value1; this.data2=value2;? this.GetResult; this.toString=function(){ if(this.GetResult) return?this.GetResult()+""; return?"0"; } } ? function?sumCalc(value1,value2){ calc.call(this,value1,value2) this.GetResult=function(){? return?this.data1+this.data2; } } function?productCalc(value1,value2){ calc.call(this,value1,value2) this.GetResult=function(){? return?this.data1*this.data2; } } var?s=new?sumCalc(2,3); alert(s.toString());??//彈框5 var?p=new?productCalc(2,3); alert(p.toString());??//彈框6
如上,sumCalc類與productCalc類都繼承并實現了calc類,并實現了“抽象函數”GetResult()。這就是JS封裝的實現方式。
另外,JS中的所有類都繼承于Object,而Object有自己的toString()函數。所以,上面calc類的toString()函數實際上覆蓋了原有的函數----多態的體現。
以上就是關于“javascript中有多態嗎”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注蝸牛博客行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。
評論