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