目錄不少人應該都知道instanceof運算子的作用是檢測物件a
是否是物件b
的例項, 即:
a instanceof b
但你們知道instanceof是依照什麼來判斷的嗎? 答案是:原型鏈如果a物件
能夠通過原型鏈到達b物件
,instanceof就會返回true
,否則返回false
function person () {} // person建構函式
var per1 = new person () // per1例項物件
console.log(per1 instanceof person) // true 黃色線的原型鏈
console.log(per1 instanceof object) // true 綠色線的原型鏈
步驟總結起來就是兩步:
找到instanceof右邊的物件的顯式原型(prototype)後,進行標記
instanceof左邊的物件沿著隱式原型(_proto_)一直向上,能找到標記就是true
,否則是false
用上面的例子為例
function person () {} // person建構函式
var per1 = new person () // per1例項物件
/* 1. 標記person.prototype 畫圈部分
2. 沿著per1的__proto__向上找
3. 能夠找到畫圈部分, 返回true
*/console.log(per1 instanceof person) // true
/* 1. 標記object.prototype 畫三角部分
2. 沿著per1的__proto__向上找, 綠色線
3. 能夠找到畫圈部分, 返回true
乍一看,直接懵逼。。。
console.log(function instanceof function) // true
console.log(function.prototype instanceof object) // true
console.log(function.__proto__ instanceof object) // true
console.log(function instanceof object) // true
那麼我們就運用上面所說的,instanceof判斷流程乙個個進行解答
第乙個:
// function建構函式是它自己(function)的例項(我生我自己)
// 所以這應該毫無懸念是true
/* 但是本著詳細探尋,我們依舊進行分析:
1. 標記function.prototype 畫圈部分
2. 沿著function的__proto__向上找(黑線部分), 能夠到達畫圈部分, true
其實第二個與第三個可以合併,因為這兩個是乙個東西:
console.log(function.prototype === function.__proto__) // true 這兩個是乙個東西
第二與第三個合併分析:
/*
1. 標記object.prototype 畫圈部分
2. 沿著function的__proto__向上找(黑線部分), 能夠到達畫圈部分, true
第四個:
/*
1. 標記object.prototype 畫圈部分
2. 沿著function的__proto__向上找(紅線部分), 能夠到達畫圈部分, true
大家猜猜結果是什麼...
結果是: true
分析見下:
/*
1. 標記object.prototype 畫圈部分
2. 沿著object的__proto__向上找(紅線部分), 能夠到達畫圈部分, true
其實原因就是,object建構函式
是new function()
產生的
function object () {}****
重新認識container
我還清楚的記得,第一次從 那兒聽說container這個詞 結果他給我解釋了半天還是似懂非懂的。今天,偷閒翻了下posa4,發現裡面對container的解釋特別清楚。粗略的理解下來是,為了分離關注點,而實現的對系統資源的封裝。豁然開朗的發現,os就是應用程式的container。突發奇想的,開發乙...
重新認識測試
以前總覺得測試是軟體開發的邊緣職位,開發人員才是軟體生命週期的核心人員。隨著對網際網路公司的了解,逐步了解到測試的重要性。以bat為例,三家公司均設定了測試開發工程師崗位,該崗位的主要職責就是編寫自動化測試案例,通過對 的邏輯進行分析,設計出能夠覆蓋大部分 的測試用例。如阿里的測試開發工程師的崗位描...
重新認識ARC
雖然用了很久的arc,感受了 簡潔。但是對arc底層實現並不了解。今天抽空研究了下,做些簡單地總結。一 strong 1.區域性變數 對於區域性變數來說,在超出作用域的地方由編譯器自動插入release。大概轉化為 在非arc返回的autorelease型別的方法 在blog手碼大概 如有錯誤還望指...