JavaScript 手動(dòng)實(shí)現(xiàn)instanceof的方法
1. instanceof的用法
instanceof運(yùn)算符用于檢測構(gòu)造函數(shù)的prototype屬性是否出現(xiàn)在某個(gè)實(shí)例對象的原型鏈上。
function Person() {}
function Person2() {}
const usr = new Person();
console.log(usr instanceof Person); // true
console.log(usr instanceof Object); // true
console.log(usr instanceof Person2); // false
如上代碼,定義了兩個(gè)構(gòu)造函數(shù),Person和Person2,又實(shí)用new操作創(chuàng)建了一個(gè)Person的實(shí)例對象usr。
實(shí)用instanceof操作符,分別檢驗(yàn)構(gòu)造函數(shù)的prototype屬性是否在usr這個(gè)實(shí)例的原型鏈上。
當(dāng)然,結(jié)果顯示,Person和Object的prototype屬性在usr的原型鏈上。usr不是Person2的實(shí)例,故Person2的prototype屬性不在usr的原型鏈上。
2. 實(shí)現(xiàn)instanceof
明白了instanceof的功能和原理后,可以自己實(shí)現(xiàn)一個(gè)instanceof同樣功能的函數(shù):
function myInstanceof(obj, constructor) {
// obj的隱式原型
let implicitPrototype = obj?.__proto__;
// 構(gòu)造函數(shù)的原型
const displayPrototype = constructor.prototype;
// 遍歷原型鏈
while (implicitPrototype) {
// 找到,返回true
if (implicitPrototype === displayPrototype) return true;
implicitPrototype = implicitPrototype.__proto__;
}
// 遍歷結(jié)束還沒找到,返回false
return false;
}
myInstanceof函數(shù)接收兩個(gè)參數(shù):實(shí)例對象obj和構(gòu)造函數(shù)constructor。
首先拿到實(shí)例對象的隱式原型:obj.__proto__,構(gòu)造函數(shù)的原型對象constructor.prototype。
接著,就可以通過不斷得到上一級(jí)的隱式原型:
implicitPrototype = implicitPrototype.__proto__;
來遍歷原型鏈,尋找displayPrototype是否在原型鏈上,若找到,返回true。
當(dāng)implicitPrototype為null時(shí),結(jié)束尋找,沒有找到,返回false。
原型鏈其實(shí)就是一個(gè)類似鏈表的數(shù)據(jù)結(jié)構(gòu)。
instanceof做的事,就是在鏈表上尋找有沒有目標(biāo)節(jié)點(diǎn)。從表頭節(jié)點(diǎn)開始,不斷向后遍歷,若找到目標(biāo)節(jié)點(diǎn),返回true。遍歷結(jié)束還沒找到,返回false。
3. 驗(yàn)證
寫一個(gè)簡單的實(shí)例驗(yàn)證一下自己實(shí)現(xiàn)的instanceof:
function Person() {}
function Person2() {}
const usr = new Person();
function myInstanceof(obj, constructor) {
let implicitPrototype = obj?.__proto__;
const displayPrototype = constructor.prototype;
while (implicitPrototype) {
if (implicitPrototype === displayPrototype) return true;
implicitPrototype = implicitPrototype.__proto__;
}
return false;
}
myInstanceof(usr, Person); // true
myInstanceof(usr, Object); // true
myInstanceof(usr, Person2); // false
myInstanceof(usr, Function); // false
myInstanceof(usr.__proto__, Person); // false
usr.__proto__ instanceof Person; // false
可以看到,myInstanceof正確得出了結(jié)果。
有趣的是,usr.__proto__ instanceof Person返回false,說明obj instanceof constructor檢測的原型鏈,不包括obj節(jié)點(diǎn)本身。
JavaScript常見手寫代碼:
到此這篇關(guān)于JavaScript 手動(dòng)實(shí)現(xiàn)instanceof的文章就介紹到這了,更多相關(guān)JavaScript instanceof內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序如何刷新當(dāng)前界面的實(shí)現(xiàn)方法
這篇文章主要介紹了微信小程序如何刷新當(dāng)前界面的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
element?UI中在?el-select?與?el-tree?結(jié)合組件實(shí)現(xiàn)過程
項(xiàng)目上實(shí)現(xiàn)某個(gè)功能,使用到了?el-select?和?el-tree?組合實(shí)現(xiàn),記錄下兩者結(jié)合的實(shí)現(xiàn)過程,對?el-select?與?el-tree?結(jié)合組件實(shí)現(xiàn)過程感興趣的朋友跟隨小編一起看看吧2023-02-02
Javascript數(shù)組操作函數(shù)總結(jié)
這篇文章主要給大家匯總介紹了Javascript數(shù)組操作函數(shù),需要的朋友可以參考下2015-02-02
淺談javascript運(yùn)算符——條件,逗號(hào),賦值,()和void運(yùn)算符
下面小編就為大家?guī)硪黄獪\談javascript運(yùn)算符——條件,逗號(hào),賦值,()和void運(yùn)算符。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
Javascript call及apply應(yīng)用場景及實(shí)例
這篇文章主要介紹了Javascript call及apply應(yīng)用場景及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
基于input框覆蓋掉數(shù)字英文的實(shí)例講解
下面小編就為大家?guī)硪黄趇nput框覆蓋掉數(shù)字英文的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
JavaScript 開發(fā)規(guī)范要求(圖文并茂)
作為一名開發(fā)人員(WEB前端JavaScript開發(fā)),不規(guī)范的開發(fā)不僅使日后代碼維護(hù)變的困難,同時(shí)也不利于團(tuán)隊(duì)的合作,通常還會(huì)帶來代碼安全以及執(zhí)行效率上的問題。2010-06-06
JavaScript利用HTML DOM進(jìn)行文檔操作的方法
DOM是W3C制定的用于訪問諸如XML和XHTML等結(jié)構(gòu)化文檔的標(biāo)準(zhǔn)。通過本文給大家介紹JavaScript利用HTML DOM進(jìn)行文檔操作的方法,需要的朋友參考下吧2016-03-03

