JS中的instanceof運算子
阿新 • • 發佈:2021-10-14
js中的instanceof運算子
MDN給出的解釋是:
instanceof
運算子用於檢測建構函式的prototype
屬性是否出現在某個例項物件的原型鏈上。
看到這裡我們就明白了instanceof是與原型和原型鏈有關係的,在弄懂instanceof之前我們就必須要了解什麼是原型和原型鏈,關於原型和原型鏈詳細的解釋可以翻看我的另一篇部落格徹底理解js的原型和原型鏈
語法:
object instanceof constructor
object ——> 某個例項物件
constructor——>某個建構函式
例項:
// 定義建構函式
function C(){}
function D(){}
//例項化物件
var o = new C();
o instanceof C; // true,因為 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因為 D.prototype 不在 o 的原型鏈上
o instanceof Object; // true,因為 Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object; // true,同上
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false,C.prototype 指向了一個空物件,這個空物件不在 o 的原型鏈上.
D.prototype = new C(); // 繼承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因為 C.prototype 現在在 o3 的原型鏈上
辨析instanceof和typeof:
instanceof的功能類似於typeof,都是判斷型別。對於值的型別,如string/number/boolean我們都可以通過typeof判斷,但是typeof在判斷引用型別時,返回值只有object/function,你不知道它到底是一個object物件,還是陣列,還是new Number等等。聽著還是有點模糊,那麼我們通過一段程式碼來更好的理解typeof的判斷型別是什麼
var a = 18; var b = 'smile'; var c = true; var d = []; var e = {}; function f() { } console.log(typeof (a));//number console.log(typeof (b));//string console.log(typeof (c));//boolean console.log(typeof (d));//object console.log(typeof (e));//object console.log(typeof (f));//function
那麼instanceof又是怎麼判斷的呢?
我們先假設有一個函式A,A有一個例項化物件a,instanceof的判斷規則是沿著a的__proto__這條線去找,同時沿著A的prototype這條線去找,如果兩條線能找到同一個引用,即同一個物件,就返回true,如果找到終點還沒有重合就返回false.同樣,我們也將通過一段程式碼來理解instance的判斷型別
function A() { } var a = new A(); var b = []; console.log(a instanceof A);//true console.log(A instanceof Function);//true console.log(b instanceof Array);//true console.log(a instanceof Array);//false