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