javascript原型鏈圖解的總結(jié)和實(shí)踐
原型鏈
在ES6中引入了class關(guān)鍵字,但是JS依然是基于原型的,class實(shí)際上是語(yǔ)法糖。
舉個(gè)例子,有一個(gè)people class:
class People { constructor(props) { this.name = props.name; } run() { console.log('run') } }
通過(guò)new people 這個(gè)class 產(chǎn)生了許多的人,張三,李四:
let lisi = new People('李四')
但是茫茫人海中,有一類人天賦異稟,他們這類人叫做超級(jí)英雄 class Hero
class Hero extends People { constructor(props) { super(props); this.power = props.power } heyHa() { alert(this.power) } }
class Hero 繼承了 People,所以英雄首先是個(gè)人,具有run方法,然后Hero具備普通人不具備的超能力heyHa方法。我們可以定義有一個(gè)英雄叫做Jinx,具有cannon的超能力:
let Jinx = new Hero({ name: 'jinx', power: 'cannon!' })
盡管實(shí)例Jinx沒有定義run方法,但是通過(guò)原型鏈可以查找到People的原型上具有這個(gè)run方法,即它的隱式原型__proto__指向構(gòu)造函數(shù)的原型
當(dāng)實(shí)例訪問某個(gè)方法或?qū)傩詴r(shí),會(huì)從自身開始,然后往原型鏈上回溯查找
Jinx.heyHa() // cannon! // 當(dāng)自身有該方法時(shí) Jinx.run = () => console.log('i just fly!') Jinx.run() // i just fly!
那么People.prototype.__proto__
指向哪里呢?Object.prototype
, 在控制臺(tái)中輸入代碼可以看到:
而Object.prototype
的__prototype__
等于 null,宇宙的盡頭是虛無(wú)。。
至此完整的原型鏈圖就是這樣的:
我們可以基于原型鏈來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)易的JQuery庫(kù)
class JQuery { constructor(selector, nodeList) { const res = nodeList || document.querySelectorAll(selector); const length = res.length; for (let i = 0; i < length; i++) { this[i] = res[i] } this.length = length; this.selector = selector; } eq(index) { return new JQuery(undefined, [this[index]]); } each(fn) { for(let i = 0; i < this.length; i ++) { const ele = this[i] fn(ele) } return this; } on(type, fn) { return this.each(ele => { ele.addEventListener(type, fn, false) }) } // 擴(kuò)展其他 DOM API } const $$ = (selector) => new JQuery(selector); $$('body').eq(0).on('click', () => alert('click'));
在控制臺(tái)中運(yùn)行一下,結(jié)果如下:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
關(guān)于微信小程序中使用wx.getLocation獲取當(dāng)前詳細(xì)位置并計(jì)算距離
這篇文章主要介紹了關(guān)于微信小程序中使用wx.getLocation獲取當(dāng)前詳細(xì)位置并計(jì)算距離,wx.getLocation只能夠獲取經(jīng)緯度,不能夠拿到詳細(xì)地址,這里使用騰訊地圖的api,需要的朋友可以參考下2023-04-04JavaScript接口的實(shí)現(xiàn)三種方式(推薦)
這篇文章主要介紹了JavaScript接口的實(shí)現(xiàn)三種方式,有注釋法,檢查屬性法和鴨式辨行法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06解決layui頁(yè)面按鈕點(diǎn)擊無(wú)反應(yīng),也不報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決layui頁(yè)面按鈕點(diǎn)擊無(wú)反應(yīng),也不報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09教你如何解密js/vbs/vbscript加密的編碼異處理小結(jié)
教你如何解密js/vbs/vbscript加密的編碼異處理加密代碼 是一篇非常不錯(cuò)的加密解密原理,希望大家仔細(xì)研究2008-06-06JS實(shí)現(xiàn)距離上次刷新已過(guò)多少秒示例
這篇文章主要介紹了JS如何實(shí)現(xiàn)距離上次刷新已過(guò)多少秒,需要的朋友可以參考下2014-05-05javascript簡(jiǎn)單鏈?zhǔn)秸{(diào)用案例分析
這篇文章主要介紹了javascript簡(jiǎn)單鏈?zhǔn)秸{(diào)用,結(jié)合具體實(shí)例形式模擬jQuery分析了鏈?zhǔn)秸{(diào)用的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05微信小程序創(chuàng)建自定義全局函數(shù)以及其調(diào)用方法詳解
微信小程序有時(shí)需要函數(shù)里面調(diào)用函數(shù),下面這篇文章主要給大家介紹了關(guān)于微信小程序創(chuàng)建自定義全局函數(shù)以及其調(diào)用方法的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09js鼠標(biāo)滑過(guò)彈出層的定位IE6bug解決辦法
大家在寫div+css的時(shí)候經(jīng)常會(huì)用到彈出層,由于IE6的bug,所以當(dāng)使用多個(gè)標(biāo)簽重復(fù)寫彈出層的時(shí)候會(huì)遇到后面的層壓在了彈出層的上面;用Jquery給彈出層的z軸依次增加高度可解決.代碼很簡(jiǎn)單,效果很顯著,需要了解的朋友可以參考下2012-12-12