JavaScript之坑了我--instanceof的判斷機制測試
原型鏈中的__proto__屬性的作用非常大,是整個原型鏈串起來的根本,是整個原型繼承體系的本質!!instanceof
就是根據原型鏈上的繼承關係判斷的。這個特點就和java的instanceOf相似了。我們來測試一下,instanceof的判斷機制,
如下:
一種情況:基於W3C標準的瀏覽器:
function Person(){}
var person1 = new Person();
console.log(person1 instanceof Person); //true
function Student(){}
var stu1 = new Student();
console.log(stu1 instanceof Student); //true
function BoyStu(){}
var boy1 = new BoyStu();
console.log(boy1 instanceof BoyStu); //true
stu1.__proto__ = person1;//此時stu1.constructor“追溯”於person1.constructor
boy1.__proto__ = stu1;//此時boy1.constructor (--> stu1.constructor) --> person1.constructor
//注意了:
console.log(boy1 instanceof BoyStu);//false因為boy1.constructor--> person1.constructor
console.log(boy1 instanceof Student); //false:因為boy1.constructor--> person1.constructor
console.log(boy1 instanceof Person);//true: 因為boy1.constructor--> person1.constructor
console.log(boy1 instanceof Object); //true: 因為boy1.constructor--> person1.__proto__.constructor
console.log(stu1 instanceof Student); //false: 因為boy1.constructor--> person1.constructor
console.log(stu1 instanceof Person); //true: 因為stu1.constructor--> person1.constructor
console.log(stu1 instanceof Object); //true: 因為stu1.constructor--> person1.__proto__.constructor
console.log(person1 instanceof Person); //true: 因為stu1.constructor--> person1.constructor
console.log(person1 instanceof Object); //true: 因 為 person1.constructor-->
person1.__proto__.constructor
一種更普通的情況:
function Person(){}
var person1 = new Person();
console.log(person1 instanceof Person); //true
function Student(){}
var stu1 = new Student();
console.log(stu1 instanceof Student); //true
function BoyStu(){}
var BoyStu_prototype_ = BoyStu.prototype ;
var boy1 = new BoyStu();//boy1.__proto__ 指向 BoyStu_prototype_
console.log(boy1 instanceof BoyStu); //true
BoyStu.prototype = stu1 ; //注意!
console.log(boy1 instanceof BoyStu); //false : 因為BoyStu.prototype 不再指向:BoyStu_prototype_
boy1.__proto__ = stu1 ; //注意!
console.log(boy1 instanceof BoyStu); //true: 因為BoyStu.prototype 和 boy1.__proto__指向一致
經過上面的測試:
我們可以得出結論:
類A的例項物件A_Obj ,只有當A_Obj.__proto__ == A.prototype && A_Obj.__proto__!= null&& A_Obj.__proto__!=undefined時,A_Obj instanceof A 才是true !!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29900383/viewspace-1827371/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript之坑了我--BOM模型速知JavaScript模型
- JavaScript之坑了我--事件模型細節JavaScript事件模型
- JavaScript之坑了我--事件繫結原理JavaScript事件
- JavaScript之坑了我--定時器用法JavaScript定時器
- JavaScript之坑了我--函式細節JavaScript函式
- JavaScript之坑了我--物件導向預熱JavaScript物件
- JavaScript之坑了我--JSON物件明析JavaScriptJSON物件
- JavaScript之坑了我--閉包原理不過如此JavaScript
- JavaScript 判斷 iPhone X Series 機型JavaScriptiPhone
- 真機測試遇到的坑!
- new和instanceof的內部機制
- 我所知道的JavaScript中判斷資料型別JavaScript資料型別
- JavaScript專題之型別判斷(上)JavaScript型別
- JavaScript專題之型別判斷(下)JavaScript型別
- 自動化測試中如何判斷測試是否通過?詳解 Pytest 測試框架的斷言用法框架
- JavaScript之坑我--陣列原理探析JavaScript陣列
- 退出、測試、判斷及操作符 shell
- 精準測試:如何判斷兩次測試中哪次的質量更好?
- JavaScript之坑了我--閉包助力OOP之模擬私有成員屬性JavaScriptOOP
- JavaScript判斷是否是手機mobile登入JavaScript
- JavaScript中this的執行機制及爬坑指南JavaScript
- JavaScript 中 this 的執行機制及爬坑指南JavaScript
- JavaScript 判斷閏年JavaScript
- Javascript判斷空物件JavaScript物件
- JavaScript判斷閏年JavaScript
- 判斷手機是否安裝app的javascript程式碼APPJavaScript
- JavaScript之坑了我--一張圖看盡原型及底層模擬JavaScript原型
- JavaScript instanceofJavaScript
- Spring Cloud Feign 熔斷機制填坑SpringCloud
- JavaScript 專題之如何判斷兩個物件相等JavaScript物件
- Javascript 判斷物件是否相等JavaScript物件
- 表分割槽機制測試
- iOS 8之後相機授權判斷iOS
- 軟體測試--詳細判斷電話號碼
- 如何判斷JavaScript的資料型別?JavaScript資料型別
- JavaScript的資料型別如何判斷JavaScript資料型別
- Javascript 中的資料型別判斷JavaScript資料型別
- javascript中的typeof和型別判斷JavaScript型別