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__;
}
}