1. 程式人生 > 其它 >JS中的instanceof運算子

JS中的instanceof運算子

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