乐趣区

关于javascript:js中的instanceof运算符

概述

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

语法

obj instanceofObject;//true 实例 obj 在不在 Object 构造函数中

形容

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

实例

1.instanceof 的一般的用法,obj instanceof Object 检测 Object.prototype 是否存在于参数 obj 的原型链上。
Person 的原型在 p 的原型链中

functionPerson(){};
var p =new Person();
console.log(p instanceof Person);//true

2. 继承中判断实例是否属于它的父类
Student 和 Person 都在 s 的原型链中

functionPerson(){};
functionStudent(){};
var p =new Person();
Student.prototype=p;// 继承原型 var s=new Student();
console.log(s instanceof Student);//trueconsole.log(s instanceof Person);//true

3. 简单用法
这里的案例要有纯熟的原型链的意识能力了解

function Person() {}
console.log(Object instanceof Object);     //true
// 第一个 Object 的原型链: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(Function instanceof Object);   //true
//Function=>
//Function.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//Object => Object.prototype

console.log(Person instanceof Function);      //true
//Person=>Person.__proto__=>Function.prototype
//Function=>Function.prototype

console.log(String instanceof String);   //false
// 第一个 String 的原型链:String=>
//String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
// 第二个 String 的原型链:String=>String.prototype

console.log(Boolean instanceof Boolean); //false
// 第一个 Boolean 的原型链:Boolean=>
//Boolean.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
// 第二个 Boolean 的原型链:Boolean=>Boolean.prototype

console.log(Person instanceof Person); //false
// 第一个 Person 的原型链:Person=>
//Person.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
// 第二个 Person 的原型链:Person=>Person.prototype

总结

对应上述标准做个函数模仿 A instanceof B:

function_instanceof(A, B){
    var O = B.prototype;// 取 B 的显示原型
    A = A.__proto__;// 取 A 的隐式原型 while (true) {//Object.prototype.__proto__ === nullif (A === null)
            returnfalse;
        if (O === A)// 这里重点:当 O 严格等于 A 时,返回 truereturntrue;
        A = A.__proto__;
    }
}
退出移动版