JavaScript instanceof
instanceof 運算符用于檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。(MDN)
instanceof 是另一種檢測類型的手段,但通常用于檢測對象之間的關系,如某個對象是不是由某個構造函數生成的。
function Person(name) {
this.name = name;
}
var person = new Person('小明');
console.log(
person instanceof Person,
); // 輸出:true
1. 語法
對象 instanceof 構造函數;
雖然語法是這樣的,其實左側可以是任意數據類型,但右側必須是一個函數。
否則會報如下錯誤:
[] instanceof {};
// Uncaught TypeError: Right-hand side of 'instanceof' is not callable
錯誤大致意思是 instanceof
的右操作數不能被調用。
在 JavaScript
,可被調用的目前只有函數。
2. 注意點
使用 instanceof
檢測的時候,不一定只有一個為 true
的結果。
function Person(name) {
this.name = name;
}
var person = new Person('小明');
console.log(
person instanceof Person,
person instanceof Object,
); // 輸出:true
因為 instanceof
實際上是去左操作數的原型鏈上尋找有沒有右操作數的原型
。
person
的原型鏈上既匹配到 Person.prototype
又能匹配到 Object.prototype
,所以都能返回 true
。
使用的時候要注意這個問題,如判斷某個對象的原型鏈上是否有 Object.prototype
的時候,要考慮到一些其他對象。
[] instanceof Object; // true
數組的原型鏈上也是有 Object.prototype
的,所以做一些檢測的時候要考慮一些特殊情況。
3. 小結
instanceof 可以用來檢測對象和構造函數之間的關系,其檢測的原理是左操作數的原型上是否有右操作數的 prototype
屬性,所以要注意一些檢測的特殊情況。