JavaScript中isPrototypeOf函數(shù)
有時(shí)看一些框架源碼的時(shí)候,會(huì)碰到 isPrototypeOf() 這個(gè)函數(shù),那么這個(gè)函數(shù)有什么作用呢?
1、isPrototypeOf()
isPrototypeOf() 是 Object函數(shù)(類(lèi))的下的一個(gè)方法,用于判斷當(dāng)前對(duì)象是否為另外一個(gè)對(duì)象的原型,如果是就返回 true,否則就返回 false。
這個(gè)函數(shù)理解的關(guān)鍵是在原型鏈上,這個(gè)據(jù)說(shuō)是JavaScript的三座大山之一。
這里不詳述其中的原理,簡(jiǎn)單的來(lái)講就是3點(diǎn):
- 1. 函數(shù)對(duì)象,都會(huì)天生自帶一個(gè)
prototype原型屬性。 - 2. 每一個(gè)對(duì)象也天生自帶一個(gè)屬性
__proto__指向生成它的函數(shù)對(duì)象的prototype。 - 3. 函數(shù)對(duì)象的
prototype也有__proto__指向生成它的函數(shù)對(duì)象的prototype。
示例1,Object類(lèi)實(shí)例:
let o = new Object(); console.log(Object.prototype.isPrototypeOf(o)); // true
因?yàn)?code>o對(duì)象是Object的實(shí)例,所以o對(duì)象的原型(__proto__)指向Object的原型(prototype),上面會(huì)輸出true。
示例2,自己定義Human類(lèi):
function Human() {}
let human = new Human();
console.log(Human.prototype.isPrototypeOf(human)); // true
這例和上例類(lèi)似,因?yàn)?code>human對(duì)象是Human的實(shí)例,所以human對(duì)象的原型(__proto__)指向Human的原型(prototype),上面會(huì)輸出true。
示例3,再來(lái)看看Object的原型(prototype)是否是human的原型:
console.log(Object.prototype.isPrototypeOf(human)); // true
為什么呢?,用代碼可能更好解釋?zhuān)?qǐng)看下面推導(dǎo):
// 因?yàn)?Human 的原型(prototype)中的原型(__proto__)指向 Object 的原型(prototype) Human.prototype.__proto__ === Object.prototype // 又因?yàn)?human 的原型(__proto__)指向 Human 的原型(prototype) huamn.__proto__ === Human.prototype // 所以human對(duì)象的原型(__proto__)的原型(__proto__)指向Object的原型(prototype) huamn.__proto__.__proto__ === Object.prototype
如果查看human的結(jié)構(gòu)就很容易清楚了:

那 Object 的原型(prototype) 是不是就是 human 對(duì)象的原型呢?確切的說(shuō)Object 的原型(prototype)是在 human 的原型鏈上。
示例4,Object.prototype是否是內(nèi)置類(lèi)的原型:
JavaScript中內(nèi)置類(lèi)Number、String、Boolean、Function、Array因?yàn)槎际抢^承Object,所以下面的輸出也都是true:
console.log(Object.prototype.isPrototypeOf(Number)); // true console.log(Object.prototype.isPrototypeOf(String)); // true console.log(Object.prototype.isPrototypeOf(Boolean)); // true console.log(Object.prototype.isPrototypeOf(Array)); // true console.log(Object.prototype.isPrototypeOf(Function)); // true
自然Object.prototype也是Number、String、Boolean、Function、Array的實(shí)例的原型。
示例5,Object也是函數(shù)(類(lèi)):
另外值得一提的是 Function.prototype 也是Object的原型,因?yàn)?code>Object也是一個(gè)函數(shù)(類(lèi)),它們是互相生成的。
請(qǐng)看下面輸出:
console.log(Object.prototype.isPrototypeOf(Function)); // true
console.log(Function.prototype.isPrototypeOf(Object)); // true
2、和 instanceof 的區(qū)別
instanceof 是用來(lái)判斷對(duì)象是否屬于某個(gè)對(duì)象的實(shí)例。
例如:
function Human() {}
let human = new Human();
// human 是 Human 的實(shí)例,所以結(jié)果輸出true
console.log(human instanceof Human); // true
// 因?yàn)樗械念?lèi)都繼承Object,所以結(jié)果也輸出true
console.log(human instanceof Object); // true
// 因?yàn)?human 對(duì)象不是數(shù)組,所以結(jié)果輸出false
console.log(human instanceof Array); // false
再來(lái)一些內(nèi)置類(lèi)的例子:
// 【1,2,3] 是 Array 的實(shí)例,所以輸出true
console.log([1, 2, 3] instanceof Array); // true
// 方法 function(){} 是 Function的實(shí)例,所以輸出true
console.log(function(){} instanceof Function);
instanceof 作用的原理就是判斷實(shí)例的原型鏈中能否找到類(lèi)的原型對(duì)象(prototype),而 isPrototypeOf 又是判斷類(lèi)的原型對(duì)象(prototype)是否在實(shí)例的原型鏈上。
所以我的理解,這兩個(gè)表達(dá)的意思是一致的,就是寫(xiě)法不同,下面兩個(gè)輸出應(yīng)該是一致的:
console.log(A instanceof B); console.log(B.prototype.isPrototypeOf(A));
小結(jié)
其實(shí)要理解 isPrototypeOf 函數(shù),關(guān)鍵是要理解原型鏈這個(gè)玩意。
到此這篇關(guān)于JavaScript中isPrototypeOf函數(shù)的文章就介紹到這了,更多相關(guān)JavaScript中isPrototypeOf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
前端必會(huì)的package.json創(chuàng)建及常見(jiàn)屬性用法示例詳解
這篇文章主要為大家介紹了前端必會(huì)的package.json創(chuàng)建及常見(jiàn)屬性用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
微信小程序 使用騰訊地圖SDK詳解及實(shí)現(xiàn)步驟
這篇文章主要介紹了微信小程序 使用騰訊地圖SDK詳解及實(shí)現(xiàn)步驟的相關(guān)資料,需要的朋友可以參考下2017-02-02
js前端架構(gòu)Git?commit提交規(guī)范
這篇文章主要為大家介紹了前端架構(gòu)Git?commit提交規(guī)范示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
微信小程序 action-sheet詳解及實(shí)例代碼
這篇文章主要介紹了微信小程序 action-sheet詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
國(guó)慶節(jié)到了,利用JS實(shí)現(xiàn)一個(gè)生成國(guó)慶風(fēng)頭像的小工具 詳解實(shí)現(xiàn)過(guò)程
明天就是國(guó)慶節(jié)了,最近看到好多好友換了國(guó)慶風(fēng)的頭像,感覺(jué)這個(gè)挺有意思,就找到了類(lèi)似的源碼研究了一番,并進(jìn)行了改造(并非原創(chuàng),只是進(jìn)行了改造,只要想分享一下實(shí)現(xiàn)思路)。下面就來(lái)看看如何實(shí)現(xiàn)一鍵生成國(guó)慶風(fēng)頭像小工具。​2021-09-09
自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法
這篇文章主要為大家介紹了自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
ECMAScript?6數(shù)組的擴(kuò)展實(shí)例詳解
這篇文章主要為大家介紹了ECMAScript?6數(shù)組的擴(kuò)展實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
js默認(rèn)文本框粘貼事件完美實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了js默認(rèn)文本框粘貼事件完美實(shí)現(xiàn)詳解,2023-01-01

