js中instanceof实现原理
文章类型:Javascript
发布者:hp
发布时间:2024-12-05
在js中,instanceof可以用来检测对象属性的类型,那么他的原理是什么呢?
1:定义:instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
2:作用:用来判断实例属于哪个构造函数
3:本质:判断实例对象的__proto__属性,和构造函数的prototype属性,是否为同一个引用(是否指向同一个地址)
4:代码:
function application() {
this.name = 'Kerry';
}
const app = new application();
app instanceof application; // true
app.__proto__ === application.prototype; // true
1:拿到 instanceof 左侧对象的原型链,再拿到 instanceof 右侧构造函数的显式原型 prototype,
2:不断遍历左边变量的原型链,并不断判断右边变量是否在左边变量的原型链上,
3:如果原型链中存在显式原型 prototype,instanceof 返回 true,否则返回 false
function instance_of(L, R) {
var O = R.prototype;
L = L.__proto__;
while (true) {
if (L === null)
return false;
if (O === L)
return true;
L = L.__proto__;
}
}
1:typeof:主要用来判断基础数据类型,比如:Number、String 等等。
2:instanceof:主要用来判断对象数据类型,比如 Function、Array 等等。
3:typeof 直接返回数据类型,而 instanceof 重在判断,它返回布尔值
1:JavaScript的每一个实例对象,都有其内置隐式的原型属性__proto__,该对象通过__proto__指向其构造函数的原型对象(prototype),
2:该构造函数也是一个对象,因此也有其内置的__proto__属性指向更上一层对象的原型对象,只有Object.prototype.__proto__属性在未修改的情况下为null值,null值没有原型对象,
3:因此null为原型链的末端。通过__proto__所串联起来的每一个对象,构成了原型链
4:图示