重新認識js中的instanceof

2022-05-19 11:29:07 字數 3162 閱讀 2793

目錄不少人應該都知道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手碼大概 如有錯誤還望指...