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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值