30歳からのプログラミング

30歳無職から独学でプログラミングを開始した人間の記録。

instanceof演算子について

instanceof演算子を使うことで、あるオブジェクトが、対象となるオブジェクトのインスタンスかどうかを調べることが出来る。

function Person(){};
var person1 = new Person();

console.log(person1 instanceof Person);   //true

上記の例では、person1は、Personインスタンスであることが分かった。

具体的にはinstanceofは、左オペランドのプロトタイプチェーンを調べ、その中に右オペランドprototypeがあれば、trueを返す。
そのため、全てのオブジェクトは基本的にObjectを継承しているため、Objectインスタンスであると判断される。

function Person(){};
var person1 = new Person();

console.log(person1 instanceof Person);   // true
console.log(person1 instanceof Object);  // true
function Person(){};
var person1 = new Person();

console.log(person1 instanceof Person);   // true
console.log(person1 instanceof Object);  // true

Person.prototype = {};

// Person.prototypeとのリンクが途切れたため、falseを返すようになる
console.log(person1 instanceof Person);   // false

// 再びリンクさせれば、trueを返すようになる
person1.__proto__ = Person.prototype;
console.log(person1 instanceof Person);   // true

constructorプロパティの値とinstanceofの挙動は無関係。
上述した通り、プロトタイプチェーンでつながっているかどうかのみが、判断基準となる。

function Person(){};
var person1 = new Person();

console.log(person1.constructor === Person);    // true

person1.__proto__.constructor = null;
console.log(person1.constructor === Person);    // false

console.log(person1 instanceof Person);   // true