一文帶你深入了解JavaScript中的原型&原型鏈
原型 & 原型鏈
大家肯定都看過(guò)一些原型和原型鏈的總結(jié)的一個(gè)圖
相信不少同學(xué)看到這幅圖腦瓜子疼,有耐心的同學(xué)可能會(huì)從頭到尾捋一捋。而我們今天的起點(diǎn)并不是這幅圖,我們通過(guò)一些案例來(lái)一步步的實(shí)現(xiàn)這幅圖,這樣是不是就有點(diǎn)意思了啊
原型
prototype
function Person() {} Person.prototype.name = "mick" var person1 = new Person() var person2 = new Person() console.log(person1.name) // mick console.log(person2.name) // mick
從案例中我們可以看到構(gòu)造函數(shù)Person
有一個(gè)屬性是prototype
。其實(shí)這個(gè)屬性指向了一個(gè)對(duì)象,這個(gè)對(duì)象正是調(diào)用構(gòu)造函數(shù)而創(chuàng)建的實(shí)例的原型,也就是person1
和person2
的原型。
那么什么是原型呢?
原型可以理解為:每一個(gè)JavaScript
對(duì)象(null除外)在創(chuàng)建的時(shí)候都會(huì)與之關(guān)聯(lián)另一個(gè)對(duì)象,這個(gè)被關(guān)聯(lián)的對(duì)象就是我們所說(shuō)的原型,每一個(gè)對(duì)象都會(huì)從原型繼承屬性。所以我們可以來(lái)實(shí)現(xiàn)圖的第一步:
__proto__
function Person() {} var person = new Person() console.log(person.__proto__ === Person.prototype) // true
我們的實(shí)例person
和 Person.prototype
有什么關(guān)系呢?從案例中我們就可以得到答案了。
每一個(gè)JavaScript
對(duì)象(除了null)都具有一個(gè)屬性叫__proto__
,這個(gè)屬性會(huì)指向該對(duì)象的原型
接著我們繼續(xù)考慮一個(gè)問(wèn)題。既然實(shí)例對(duì)象和構(gòu)造函數(shù)都可以指向原型,那么原型是否有屬性指向構(gòu)造函數(shù)或者實(shí)例呢?
constructor
指向?qū)嵗牡故菦](méi)有,因?yàn)橐粋€(gè)構(gòu)造函數(shù)可以生成多個(gè)實(shí)例,但是原型指向構(gòu)造函數(shù)是有的,那就是constructor
。每一個(gè)原型都有一個(gè)constructor
屬性指向關(guān)聯(lián)的構(gòu)造函數(shù)。
function Person() {} console.log(Person === Person.prototype.constructor) // true
這里我們可以得到下面的總結(jié)
function Person() { } var person = new Person(); console.log(person.__proto__ == Person.prototype) // true console.log(Person.prototype.constructor == Person) // true console.log(Object.getPrototypeOf(person) === Person.prototype) // true
原型鏈
當(dāng)我們讀取實(shí)例上的一個(gè)屬性的時(shí)候,如果找不到,就會(huì)查找與實(shí)例關(guān)聯(lián)的原型中的屬性,如果還是找不到,就去找原型的原型,一直找到最頂層為止。
function Person() {} Person.prototype.name = "mick" var person = new Person() person.name = "randy" console.log(person.name) // randy delete person.name console.log(person.name) // mick
首先我們我們給實(shí)例對(duì)象person
添加屬性name
,結(jié)果肯定是randy
。但是當(dāng)我們刪除了name
屬性的時(shí)候,那么在person
的實(shí)例上就找不到name
屬性了,那就會(huì)從person
實(shí)例的原型查找,也就是person.__proto__
,也就是Person.prototype
查找,找到了mick
。
那如果Person.prototype
也沒(méi)找到呢?
原型的原型
var obj = new Object() obj.name = "mick" console.log(obj.mick) // mick
原型對(duì)象就是通過(guò)Object
構(gòu)造函數(shù)生成的,我們繼續(xù)依據(jù)上面的問(wèn)題來(lái)說(shuō),實(shí)例的__proto__
指向構(gòu)造函數(shù)的prototype
這個(gè)圖一出來(lái)是不是感覺(jué)我們快完成了呢?其實(shí)還差一丟丟。我們可以通過(guò)原型一層層的向上找,總要有個(gè)盡頭吧。
console.log(Object.prototype.__proto__ === null) // true
null
代表了沒(méi)有對(duì)象,即此處不應(yīng)該有值。這下我們可以完整的畫(huà)圖了
到此這篇關(guān)于一文帶你深入了解JavaScript中的原型&原型鏈的文章就介紹到這了,更多相關(guān)JavaScript原型 原型鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript json object 與string 相互轉(zhuǎn)換的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇Javascript json object 與string 相互轉(zhuǎn)換的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09echarts折線圖實(shí)現(xiàn)部分虛線部分實(shí)線效果的方法
在折線圖中,通常實(shí)線表示實(shí)際數(shù)據(jù),而虛線用于表示預(yù)測(cè)數(shù)據(jù),這篇文章主要介紹了echarts折線圖實(shí)現(xiàn)部分虛線部分實(shí)線效果的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09原生JavaScript實(shí)現(xiàn)精美的淘寶輪播圖效果示例【附demo源碼下載】
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)精美的淘寶輪播圖效果,結(jié)合完整實(shí)例形式詳細(xì)分析了javascript實(shí)現(xiàn)淘寶輪播圖功能的相關(guān)HTML布局、css及js核心功能代碼,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-05-05原生JS封裝拖動(dòng)驗(yàn)證滑塊的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了原生JS封裝拖動(dòng)驗(yàn)證滑塊的實(shí)現(xiàn)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06JavaScript返回網(wǎng)頁(yè)中超鏈接數(shù)量的方法
這篇文章主要介紹了JavaScript返回網(wǎng)頁(yè)中超鏈接數(shù)量的方法,使用javascript中的document.links實(shí)現(xiàn)這一功能,需要的朋友可以參考下2015-04-04javascript html5搖一搖功能的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了javascript html5搖一搖功能的實(shí)現(xiàn)過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04JS實(shí)現(xiàn)重新加載當(dāng)前頁(yè)面
本文主要介紹用JavaScript刷新上級(jí)頁(yè)面和當(dāng)前頁(yè)面。附上具體實(shí)例代碼。需要的朋友可以參考下2016-11-11探索JavaScript函數(shù)的無(wú)限可能(函數(shù)基本概念)
JavaScript中的函數(shù)是一種重要的編程概念,它允許我們封裝可重用的代碼塊,并在需要時(shí)進(jìn)行調(diào)用,本文將深入介紹JavaScript函數(shù)的各個(gè)方面,包括函數(shù)定義和調(diào)用、參數(shù)和返回值、作用域和閉包、高階函數(shù)以及常見(jiàn)的函數(shù)應(yīng)用場(chǎng)景,感興趣的朋友一起看看吧2023-08-08