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