摘要:多態(tài)的實際含義是,同一操作,作用在不同的對象上面,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果。的變量類型在運行期是可變的,這就意味著對象的多態(tài)性是與生俱來的。
多態(tài)的實際含義是,同一操作,作用在不同的對象上面,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果。
javascript的變量類型在運行期是可變的,這就意味著javascript對象的多態(tài)性是與生俱來的。
Java語言是一門靜態(tài)類型的語言,由于在代碼編譯時要進(jìn)行嚴(yán)格的類型檢查,所以不能給變量賦予不同類型的值,這種類型檢查就會使代碼變得僵硬,但是java也可以通過繼承得到多態(tài)的效果(實現(xiàn)繼承和接口繼承) 可以向上轉(zhuǎn)型來實現(xiàn)多態(tài)。
下面一張圖來解釋:
主人同時向雞和鴨兩個對象發(fā)出指令 "發(fā)出叫聲", 雞和鴨同時發(fā)出叫聲,但是他們的叫聲是不一樣的。
我們用代碼來演示這個例子:
傳統(tǒng)的代碼我們習(xí)慣用 if else 來堆砌硬編碼代碼,但是如果這個對象一直往上加就會造成不斷的加代碼,修改代碼總是很危險的,修改的地方越多,程序出錯的可能性就會越大,而且當(dāng)動物的類型越多的時候就會造成if else 堆砌成了一個巨大的函數(shù),不利于維護。
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());
如何理解如果對象無法響應(yīng)某個請求,它會把這個請求委托給它的構(gòu)造器的原型,這條原則是原型繼承的精髓所在,下面有這樣的一段代碼:
var obj = {name:"lin"};
var A = function() {};
A.prototype = obj;
var a = new A();
console.log(a.name);
解釋:遍歷對象a所有的屬性,沒有找到name這個屬性
查找name屬性的這個請求被委托給對象a的構(gòu)造器的原型,它被a._proto_記錄并且指向A.prototype,
而A.prototype被設(shè)置為對象obj
在對象obj中找到name屬性,并且返回
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92694.html
摘要:當(dāng)我們對一些函數(shù)發(fā)出調(diào)用的消息時,這些函數(shù)會返回不同的執(zhí)行結(jié)果,這是多態(tài)性的一種體現(xiàn),也是很多設(shè)計模式在中可以用高階函數(shù)來代替實現(xiàn)的原因。 PS:上一篇文章發(fā)表之后,很多朋友關(guān)注了本人的思否和掘金的博客,雖然關(guān)注的朋友還有有限,但足夠讓我把自己在技術(shù)上的問題積累分享給大家,也希望大家能夠喜歡,同時能動一動手指,給一顆心(贊),博主會持續(xù)更新下去 多態(tài) 本文是《javascript設(shè)計模...
摘要:在中,并沒有對抽象類和接口的支持。例如,當(dāng)對象需要對象的能力時,可以有選擇地把對象的構(gòu)造器的原型指向?qū)ο螅瑥亩_(dá)到繼承的效果。本節(jié)內(nèi)容為設(shè)計模式與開發(fā)實踐第一章筆記。 動態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動態(tài)類型語言。 靜態(tài)類型語言在編譯時已確定變量類型,動態(tài)類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:之前,本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因為它對于封裝繼承多態(tài)這些面向?qū)ο笳Z言的特點并沒有在語言層面上提供原生的支持。所以在中出現(xiàn)了等關(guān)鍵字,解決了面向?qū)ο笾谐霈F(xiàn)了問題。 ES6之前,javascript本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因為它對于封裝、繼承、多態(tài)這些面向?qū)ο笳Z言的特點并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
摘要:動態(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)該書對這方面的知識點介紹的很易于理解,因此...
摘要:為什么要學(xué)習(xí)設(shè)計模式做事情之前問個為什么總是好的。設(shè)計模式的使用方法關(guān)于使用方式,像我這種初學(xué)者最容易犯的錯誤就是生搬硬套,但是模仿本來也是學(xué)習(xí)的一個過程,最重要的事情是在模仿中要學(xué)會思考。 為什么要學(xué)習(xí)設(shè)計模式? 做事情之前問個為什么總是好的。關(guān)于設(shè)計模式的好壞,我在知乎上也看過一些討論,有知友對其提出過一些疑問,里面有一些關(guān)于設(shè)計模式的觀點: 設(shè)計模式有何不妥,所謂的荼毒體現(xiàn)在哪...
閱讀 1460·2019-08-29 17:14
閱讀 1656·2019-08-29 12:12
閱讀 738·2019-08-29 11:33
閱讀 3273·2019-08-28 18:27
閱讀 1449·2019-08-26 10:19
閱讀 912·2019-08-23 18:18
閱讀 3535·2019-08-23 16:15
閱讀 2548·2019-08-23 14:14