最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中isPrototypeOf函數(shù)

 更新時(shí)間:2021年11月04日 16:38:43   作者:快樂編程  
這篇文章主要介紹了JavaScript中isPrototypeOf函數(shù),isPrototypeOf() 是 Object函數(shù)(類)的下的一個(gè)方法,用于判斷當(dāng)前對象是否為另外一個(gè)對象的原型,如果是就返回 true,否則就返回 false,下面來看看詳細(xì)內(nèi)容,需要的朋友可以參考一下

 有時(shí)看一些框架源碼的時(shí)候,會(huì)碰到 isPrototypeOf() 這個(gè)函數(shù),那么這個(gè)函數(shù)有什么作用呢?

1、isPrototypeOf()

isPrototypeOf() Object函數(shù)(類)的下的一個(gè)方法,用于判斷當(dāng)前對象是否為另外一個(gè)對象的原型,如果是就返回 true,否則就返回 false

這個(gè)函數(shù)理解的關(guān)鍵是在原型鏈上,這個(gè)據(jù)說是JavaScript的三座大山之一。

這里不詳述其中的原理,簡單的來講就是3點(diǎn):

  • 1. 函數(shù)對象,都會(huì)天生自帶一個(gè)prototype原型屬性。
  • 2. 每一個(gè)對象也天生自帶一個(gè)屬性__proto__指向生成它的函數(shù)對象的prototype。
  • 3. 函數(shù)對象的prototype也有__proto__指向生成它的函數(shù)對象的prototype

示例1,Object類實(shí)例:

let o = new Object();
console.log(Object.prototype.isPrototypeOf(o)); // true


因?yàn)?code>o對象是Object的實(shí)例,所以o對象的原型(__proto__)指向Object的原型(prototype),上面會(huì)輸出true。

示例2,自己定義Human類:

function Human() {}
let human = new Human();
 
console.log(Human.prototype.isPrototypeOf(human)); // true


這例和上例類似,因?yàn)?code>human對象是Human的實(shí)例,所以human對象的原型(__proto__)指向Human的原型(prototype),上面會(huì)輸出true。

示例3,再來看看Object的原型(prototype)是否是human的原型:

console.log(Object.prototype.isPrototypeOf(human)); // true


為什么呢?,用代碼可能更好解釋,請看下面推導(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對象的原型(__proto__)的原型(__proto__)指向Object的原型(prototype)
huamn.__proto__.__proto__  === Object.prototype


如果查看human的結(jié)構(gòu)就很容易清楚了:

Object 的原型(prototype) 是不是就是 human 對象的原型呢?確切的說Object 的原型(prototype)是在 human 的原型鏈上。

示例4,Object.prototype是否是內(nèi)置類的原型:

JavaScript中內(nèi)置類Number、String、Boolean、FunctionArray因?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ù)(類):

另外值得一提的是 Function.prototype 也是Object的原型,因?yàn)?code>Object也是一個(gè)函數(shù)(類),它們是互相生成的。

請看下面輸出:

console.log(Object.prototype.isPrototypeOf(Function)); // true
console.log(Function.prototype.isPrototypeOf(Object)); // true

2、和 instanceof 的區(qū)別

instanceof 是用來判斷對象是否屬于某個(gè)對象的實(shí)例。

例如:

function Human() {}
let human = new Human();
 
// human 是 Human 的實(shí)例,所以結(jié)果輸出true
console.log(human instanceof Human); // true
 
// 因?yàn)樗械念惗祭^承Object,所以結(jié)果也輸出true
console.log(human instanceof Object); // true
 
// 因?yàn)?human 對象不是數(shù)組,所以結(jié)果輸出false
console.log(human instanceof Array); // false


再來一些內(nè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í)例的原型鏈中能否找到類的原型對象(prototype),而 isPrototypeOf 又是判斷類的原型對象(prototype)是否在實(shí)例的原型鏈上。

所以我的理解,這兩個(gè)表達(dá)的意思是一致的,就是寫法不同,下面兩個(gè)輸出應(yīng)該是一致的:

console.log(A instanceof B);
console.log(B.prototype.isPrototypeOf(A));


小結(jié)

其實(shí)要理解 isPrototypeOf 函數(shù),關(guān)鍵是要理解原型鏈這個(gè)玩意。

到此這篇關(guān)于JavaScriptisPrototypeOf函數(shù)的文章就介紹到這了,更多相關(guān)JavaScript中isPrototypeOf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

肥西县| 拉萨市| 金山区| 柳林县| 盐池县| 哈密市| 株洲县| 永清县| 财经| 三门峡市| 海安县| 青海省| 桓台县| 怀宁县| 景宁| 陈巴尔虎旗| 来凤县| 永年县| 逊克县| 和田县| 美姑县| 来宾市| 奉节县| 元氏县| 荣成市| 临邑县| 澄迈县| 雷州市| 苏尼特右旗| 民勤县| 惠水县| 临清市| 襄汾县| 邵东县| 抚州市| 宿迁市| 阳山县| 大城县| 万宁市| 灯塔市| 山东省|