java的intanceof深层原理,instanceof的判断原理
发布日期:2021-06-24 19:28:33 浏览次数:6 分类:技术文章

本文共 1368 字,大约阅读时间需要 4 分钟。

//自定义一个构造函数

function Fun(){}

//利用上面的构造函数构造一个实例

var fun1 = new Fun()

console.log(fun1 instanceof Fun) //true

console.log(fun1 instanceof Function) //false

console.log(fun1 instanceof Object) //true

Instanceof运算符的前面的,暂时称为A;后面一般是一个函数,暂时称为B。

Instanceof的判断规则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果能找到同一个引用,返回true,否则返回false。

那我们来按照这个规则一个一个来验证上面的结果:

注意:每个函数都有一个prototype属性(原型),是一个对象,每个对象都有一个__proto__(隐式原型),指向它的构造函数的 prototype(原型)(也是一个对象),对象没有prototype

1、fun1 instanceof Fun

第一步: fun1.__proto__=Fun.prototype={Fun的原型}

第二步: {原型}.__proto__=Object.prototype={Object的原型}

Object就是祖先了,万物皆对象就是这意思,所以它没有构造函数了,所以也就没{Object的原型}.__proto__了,结束

思如果再{Object的原型}.__proto__会得到null,可以再控制台的console面板试试

第一步: Fun.prototype={Fun的原型}

{Funde原型}是一个对象,对象没有prototype,结束

从上可以看出,在第一步A和B就找到同一个引用,所以返回true

注意:因为prototype是一个对象,所以它的__proro__就是Object.prototype

2、fun1 instanceof Function

第一步: fun1.__proto__=Fun.prototype={Fun的原型}

第二步: {Fun的原型}.__proto__=Object.prototype={Object的原型}

Object就是祖先了,所以它没有构造函数了,所以也就没{Object的原型}.__proto__了,结束

第一步: Function.prototype={Function的原型}

{Function的原型}是一个对象,没有prototype,结束

可以看出fun1和Fun始终没有找到同一个引用

3、fun1 instanceof Object

第一步: fun1.__proto__=Fun.prototype={Fun的原型}

第二步: {Fun的原型}.__proto__=Object.prototype={Object的原型}

Object就是祖先了,所以它没有构造函数了,所以也就没{Object的原型}.__proto__了,结束

第一步: Object.prototype={Object的原型}

{Object的原型}是一个对象,没有prototype,结束

从上可以看出,fun1和Object最后找到了同一个引用

转载地址:https://blog.csdn.net/weixin_34262786/article/details/116089820 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:php个位对齐,中心使用GD和PHP对齐多行文本
下一篇:Java发射子弹出错,Java多线程---枪有20发子弹,实现子弹不停上膛射出的过程,生产者消费者...

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月23日 20时27分49秒