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