摘要:按照標(biāo)準(zhǔn),是不對(duì)外公開的,也就是說(shuō)是個(gè)私有屬性,但是的引擎將他暴露了出來(lái)成為了一個(gè)共有的屬性,我們可以對(duì)外訪問(wèn)和設(shè)置。這條鏈就形成了原型鏈,繼承也就通過(guò)原型鏈得以實(shí)現(xiàn)。
**js中的繼承,是面向?qū)ο蟮闹R(shí),因?yàn)閖s沒(méi)有類的概念,所以繼承是通過(guò)對(duì)象實(shí)現(xiàn)的,談到繼承,就必須說(shuō)到prototype,就不得不先說(shuō)下new的過(guò)程。
一個(gè)小小的列子:**
<1> var p={}; 也就是說(shuō),初始化一個(gè)對(duì)象p。
<2> p.proto=Person.prototype;
<3> Person.call(p);也就是說(shuō)構(gòu)造p,也可以稱之為初始化p。
關(guān)鍵在于第二步,我們來(lái)證明一下:
alert(p.__proto__ === Person.prototype);
這段代碼會(huì)返回true。說(shuō)明我們步驟2的正確。
那么proto是什么?我們?cè)谶@里簡(jiǎn)單地說(shuō)下。每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性,就是proto,當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的屬性 時(shí),如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去proto里找這個(gè)屬性,這個(gè)proto又會(huì)有自己的proto,于是就這樣 一直找下去,也就是我們平時(shí)所說(shuō)的原型鏈的概念。
按照標(biāo)準(zhǔn),proto是不對(duì)外公開的,也就是說(shuō)是個(gè)私有屬性,但是Firefox的引擎將他暴露了出來(lái)成為了一個(gè)共有的屬性,我們可以對(duì)外訪問(wèn)和設(shè)置。
這段代碼很簡(jiǎn)單,相信每個(gè)人都這樣寫過(guò),那就讓我們看下為什么p可以訪問(wèn)Person的Say。
首先var p=new Person();可以得出p.proto=Person.prototype。那么當(dāng)我們調(diào)用p.Say()時(shí),首先p中沒(méi)有Say這個(gè)屬性, 于是,他就需要到他的proto中去找,也就是Person.prototype,而我們?cè)谏厦娑x了 Person.prototype.Say=function(){}; 于是,就找到了這個(gè)方法。
下面我們?cè)倏匆幌掠悬c(diǎn)饒人的列子。
function tiger(){ this.bark=function(){ alert("我會(huì)咬人"); }; }; //這里先定義一個(gè)老虎方法 function cat(){ this.climb=function(){ alert("我會(huì)爬樹"); }; }; //定義一個(gè)貓方法 //怎么通過(guò)繼承讓老虎也學(xué)會(huì)爬樹?下面開始繼承。 tiger.prototype=new cat(); var hnhu=new tiger(); hnhu.climb(); hnhu.valueof(); //是不是很神奇,老虎也會(huì)爬樹啦,嘿嘿
結(jié)合上面的概念,我分析一下具體的繼承過(guò)程,首先new一個(gè)tiger對(duì)象,有hnhu.proto=tiger.prototype,有因?yàn)閠iger.prototype=new cat();
所以tiger.prototype.proto=cat.prototype。至此繼承已經(jīng)付出水面,轉(zhuǎn)化一下得到:
hnhu.proto=tiger.prototype
hnhu.proto.proto=cat.prototype
好,算清楚了之后我們來(lái)看上面的結(jié)果,hnhu.climb()。由于hnhu沒(méi)有climb這個(gè)屬性,于是去hnhu.proto,也就是 tiger.prototype中去找,由于tiger.prototype中也沒(méi)有climb,那就去hnhu.proto.proto,也就是cat.prototype中去找,于是就找到了alert(“我會(huì)爬樹”);的方法。
尋找valueof()也都是同樣的道理。這條鏈就形成了原型鏈,繼承也就通過(guò)原型鏈得以實(shí)現(xiàn)。
以上代碼圖示:
原型和原型鏈就是這樣,跟作用域和作用域鏈類似,需要慢慢品味其中的精華。
掌握了在來(lái)實(shí)際用一下把,企鵝的一道繼承面試題,大概意思是一只狗剛開始會(huì)嗚嗚的叫,然后發(fā)生某種變異,叫聲變?yōu)樽儺悺R笥迷屠^承實(shí)現(xiàn)上述過(guò)程
function dog(){ this.fark=function(){ alert("嗚嗚"); }; }; function peter(){ this.money=function(){ alert("我是有錢狗"); }; }; peter.prototype=new dog(); peter.prototype.bark=function(){ alert("變異"); }; var tz=new peter(); tz.bark(); tz.fark();
你甚至可以在Object.prototype上增加一些新屬性,添加上之后不管是不是變異狗都具有這項(xiàng)屬性,因?yàn)镺bject處于原型鏈的倒數(shù)第二層,上面的方法都會(huì)繼承它的屬性,但是這樣有一定的問(wèn)題,所有的狗都具有這個(gè)原型鏈中的方法了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85892.html
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:使用異步編程,有一個(gè)事件循環(huán)。它作為面向?qū)ο缶幊痰奶娲桨?,其中?yīng)用狀態(tài)通常與對(duì)象中的方法搭配并共享。在用面向?qū)ο缶幊虝r(shí)遇到不同的組件競(jìng)爭(zhēng)相同的資源的時(shí)候,更是如此。 翻譯:瘋狂的技術(shù)宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 不管你是面試官還是求職者,里面...
摘要:雖然是弱類型的語(yǔ)言,但是也有構(gòu)造函數(shù)和實(shí)例。也就是說(shuō),我們只在第一次調(diào)用構(gòu)造函數(shù)時(shí)創(chuàng)建新對(duì)象,之后調(diào)用返回時(shí)返回該對(duì)象即可。而我不認(rèn)為這是一個(gè)單例模式的原因如下我覺(jué)得既然兩次調(diào)用同一個(gè)構(gòu)造函數(shù),返回的不是同一個(gè)對(duì)象,那不就不能成為單例模式。 寫在前面 (度過(guò)一陣的繁忙期,又可以愉快的開始學(xué)習(xí)新知識(shí)了,一年來(lái)技術(shù)棧切來(lái)切去,卻總覺(jué)得js都還沒(méi)學(xué)完-_-) 本文主要圍繞js的設(shè)計(jì)模式進(jìn)行展...
摘要:構(gòu)造函數(shù),實(shí)例構(gòu)造函數(shù),是用來(lái)創(chuàng)建對(duì)象的函數(shù),本質(zhì)上也是函數(shù)。這里剛好解釋一下時(shí),說(shuō)到的,可以通過(guò)實(shí)例的訪問(wèn)構(gòu)造函數(shù),但是本質(zhì)上是原型對(duì)象的屬性。 前言 最近在學(xué)vue,到周末終于有空寫一些東西了(想想又能騙贊,就有點(diǎn)小激動(dòng)?。?。在javascript基礎(chǔ)中,除了閉包之外,繼承也是一個(gè)難點(diǎn)。因?yàn)榭紤]到篇幅較長(zhǎng),所以打算分成兩個(gè)部分來(lái)寫。同樣基于《javascript高級(jí)程序設(shè)計(jì)》,做一...
摘要:每一個(gè)對(duì)象直接量都是的子類,即構(gòu)造函數(shù)中的構(gòu)造函數(shù)與普通函數(shù)并沒(méi)有什么兩樣,只不過(guò)在調(diào)用時(shí),前面加上了關(guān)鍵字,就當(dāng)成是構(gòu)造函數(shù)了。由于沒(méi)有傳入變量,在調(diào)用的構(gòu)造函數(shù)時(shí),會(huì)出錯(cuò)這個(gè)問(wèn)題可以通過(guò)一個(gè)空對(duì)象來(lái)解決改自。 showImg(https://segmentfault.com/img/bVmNZj); 對(duì)于 OO 語(yǔ)言,有一句話叫Everything is object,雖然 Ja...
閱讀 2088·2021-09-29 09:35
閱讀 692·2021-09-08 09:36
閱讀 3400·2021-09-03 10:30
閱讀 2118·2019-08-30 14:21
閱讀 2915·2019-08-30 11:18
閱讀 3319·2019-08-29 17:31
閱讀 3147·2019-08-29 17:29
閱讀 1314·2019-08-29 17:13