摘要:多態的實際含義是,同一操作,作用在不同的對象上面,可以產生不同的解釋和不同的執行結果。的變量類型在運行期是可變的,這就意味著對象的多態性是與生俱來的。
多態的實際含義是,同一操作,作用在不同的對象上面,可以產生不同的解釋和不同的執行結果。
javascript的變量類型在運行期是可變的,這就意味著javascript對象的多態性是與生俱來的。
Java語言是一門靜態類型的語言,由于在代碼編譯時要進行嚴格的類型檢查,所以不能給變量賦予不同類型的值,這種類型檢查就會使代碼變得僵硬,但是java也可以通過繼承得到多態的效果(實現繼承和接口繼承) 可以向上轉型來實現多態。
下面一張圖來解釋:
主人同時向雞和鴨兩個對象發出指令 "發出叫聲", 雞和鴨同時發出叫聲,但是他們的叫聲是不一樣的。
我們用代碼來演示這個例子:
傳統的代碼我們習慣用 if else 來堆砌硬編碼代碼,但是如果這個對象一直往上加就會造成不斷的加代碼,修改代碼總是很危險的,修改的地方越多,程序出錯的可能性就會越大,而且當動物的類型越多的時候就會造成if else 堆砌成了一個巨大的函數,不利于維護。
var makeSound = function(animal) { if (animal instanceof Dog) { console.log("wanwan"); } else if(animal instanceof Cat) { console.log("miaomiao"); } } var Dog = function() {} var Cat = function() {} makeSound(new Dog()); makeSound(new Cat());
修改之后的代碼如下:
var makeSound = function(animal) { animal.sound(); } var Dog = function() {} Dog.prototype.sound = function(){ console.log("wanwan"); } var Cat = function() {} Cat.prototype.sound = function() { console.log("miaomiao"); } makeSound(new Dog()); makeSound(new Cat());
如何理解如果對象無法響應某個請求,它會把這個請求委托給它的構造器的原型,這條原則是原型繼承的精髓所在,下面有這樣的一段代碼:
var obj = {name:"lin"};
var A = function() {};
A.prototype = obj;
var a = new A();
console.log(a.name);
解釋:遍歷對象a所有的屬性,沒有找到name這個屬性
查找name屬性的這個請求被委托給對象a的構造器的原型,它被a._proto_記錄并且指向A.prototype,
而A.prototype被設置為對象obj
在對象obj中找到name屬性,并且返回
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92694.html
摘要:當我們對一些函數發出調用的消息時,這些函數會返回不同的執行結果,這是多態性的一種體現,也是很多設計模式在中可以用高階函數來代替實現的原因。 PS:上一篇文章發表之后,很多朋友關注了本人的思否和掘金的博客,雖然關注的朋友還有有限,但足夠讓我把自己在技術上的問題積累分享給大家,也希望大家能夠喜歡,同時能動一動手指,給一顆心(贊),博主會持續更新下去 多態 本文是《javascript設計模...
摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構造器的原型指向對象,從而達到繼承的效果。本節內容為設計模式與開發實踐第一章筆記。 動態類型語言 編程語言按數據類型大體可以分為兩類:靜態類型語言與動態類型語言。 靜態類型語言在編譯時已確定變量類型,動態類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:之前,本質上不能算是一門面向對象的編程語言,因為它對于封裝繼承多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。所以在中出現了等關鍵字,解決了面向對象中出現了問題。 ES6之前,javascript本質上不能算是一門面向對象的編程語言,因為它對于封裝、繼承、多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
摘要:動態類型語言和鴨子類型編程語言按照數據類型大體可分為靜態類型語言和動態類型語言。鴨子類型的概念至關重要,比如一個對象有了屬性,也可以依照下標來存取屬性,這個對象就可以被當做數組來使用。 前言 曾經對Javascript的面向對象相關知識也有過了解,從各種博客、書籍上也學到了很多。但是最近在看《Javascript設計模式與開發實戰》這本書時發現該書對這方面的知識點介紹的很易于理解,因此...
摘要:為什么要學習設計模式做事情之前問個為什么總是好的。設計模式的使用方法關于使用方式,像我這種初學者最容易犯的錯誤就是生搬硬套,但是模仿本來也是學習的一個過程,最重要的事情是在模仿中要學會思考。 為什么要學習設計模式? 做事情之前問個為什么總是好的。關于設計模式的好壞,我在知乎上也看過一些討論,有知友對其提出過一些疑問,里面有一些關于設計模式的觀點: 設計模式有何不妥,所謂的荼毒體現在哪...
閱讀 1439·2019-08-29 17:14
閱讀 1646·2019-08-29 12:12
閱讀 727·2019-08-29 11:33
閱讀 3261·2019-08-28 18:27
閱讀 1442·2019-08-26 10:19
閱讀 904·2019-08-23 18:18
閱讀 3525·2019-08-23 16:15
閱讀 2539·2019-08-23 14:14