js中instanceof运算符用法解析

instanceof

概述
instanceof运算符是用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上

语法: object instanceof constructor

参数: object(要检测的对象,如果不是对象,直接返回false)constructor(某个构造函数)
描述: instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

let num=1;     //非对象
console.log(num instanceof Number); //false
num =new Number(1);
console.log(num instanceof Number); //true

实例:
1、普通用法,obj instanceof Object 检测Object.prototype是否存在于参数obj的原型链上。

function Person(){} 
var p = new Person(); 
//p.__proto__==Person.prototype
console.log(p instanceof Person);  //true
//Person.prototype.__proto__==Object.prototype
//p.__proto__.__proto__==Object.prototype
console.log(p instanceof Object);  //true

2、在继承关系中用来判断一个实例是否属于它的父类

function Father(){};
function Child(){};
var f =new Father();
Child.prototype=f;      //继承原型
var c=new Child();
console.log(c instanceof Child);//true
//c.__proto__==Child.prototype==f
//c.__proto__.__proto__==f.__proto_==Father.prototype
console.log(c instanceof Father);//true

如果还是不理解instanceof,可以参考以下代码:

function _instanceof(A, B) {
    var O = B.prototype;// 取B的显示原型
    A = A.__proto__;// 取A的隐式原型
    while (true) {
        if (A === null) 
 //Object.prototype.__proto__ === null,遍历完整条原型链都没有找到,返回false
            return false;
        if (O === A)   //找到了返回true
            return true;
        A = A.__proto__; //继续往隐式原型走,直到遍历完整条原型链
    }
}

在理解以上代码后可以看一下下面的例子:

console.log(Object instanceof Object);//true 
//第一个Object的原型链:
//Object.__proto__ => Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Object的原型:
//Object=> Object.prototype
console.log(Function instanceof Function);//true 
//第一个Function的原型链:
//Function=>Function.__proto__ => Function.prototype
//第二个Function的原型:
//Function=>Function.prototype
console.log(Number instanceof Number);//false 
//第一个Number的原型链:
//Number=>Number.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Number的原型链:String=>String.prototype
console.log(String instanceof String);//false  
//第一个String的原型链:
//String=>String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个String的原型链:String=>String.prototype
console.log(Function instanceof Object);//true  
//第一个Function的原型链:
//Function.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Object的原型:
//Object=> Object.prototype
发布了3 篇原创文章 · 获赞 3 · 访问量 362

猜你喜欢

转载自blog.csdn.net/qq_42880714/article/details/104424412