概要: このチュートリアルでは、JavaScript のinstanceof
演算子を使用して、コンストラクタのプロトタイプがオブジェクトのプロトタイプチェーンに表示されるかどうかを判断する方法を学習します。
JavaScript instanceof 演算子の紹介
instanceof
演算子は、コンストラクタのプロトタイプ(constructor.prototype
)がオブジェクトのプロトタイプチェーンに表示される場合にtrue
を返します。
instanceof
演算子の構文を以下に示します。
object instanceof contructor
Code language: JavaScript (javascript)
この構文において
object
はテストするオブジェクトです。constructor
はテスト対象の関数です。
JavaScript instanceof 演算子の例
次の例では、Person
型を定義し、instanceof
演算子を使用してオブジェクトがその型のインスタンスかどうかを確認します。
function Person(name) {
this.name = name;
}
let p1 = new Person('John');
console.log(p1 instanceof Person); // true
Code language: JavaScript (javascript)
動作方法。
まず、コンストラクタ関数パターンを使用してPerson
型を定義します。
function Person(name) {
this.name = name;
}
Code language: JavaScript (javascript)
次に、Person
型の新しいオブジェクトを作成します。
let p1 = new Person('John Doe');
Code language: JavaScript (javascript)
次に、person
がPerson
型のインスタンスかどうかを確認します。
console.log(p1 instanceof Person); // true
Code language: JavaScript (javascript)
Person.prototype
がp1
オブジェクトのプロトタイプチェーンに表示されるため、true
を返します。p1
のプロトタイプチェーンは、p1
、Person.prototype
、およびObject.prototype
間のリンクです。
Object.prototype
がp1
オブジェクトのプロトタイプチェーンに表示されるため、これもtrue
を返します。
console.log(p1 instanceof Object); // true
Code language: JavaScript (javascript)
ES6 クラスと instanceof 演算子
次の例では、Person
クラスを定義し、instanceof
演算子を使用してオブジェクトがクラスのインスタンスかどうかを確認します。
class Person {
constructor(name) {
this.name = name;
}
}
let p1 = new Person('John');
console.log(p1 instanceof Person); // true
Code language: JavaScript (javascript)
動作方法。
まず、Person
クラスを定義します。
class Person {
constructor(name) {
this.name = name;
}
}
Code language: JavaScript (javascript)
次に、Person
クラスの新しいインスタンスを作成します。
let p1 = new Person('John');
Code language: JavaScript (javascript)
次に、p1
がPerson
クラスのインスタンスかどうかを確認します。
console.log(p1 instanceof Person); // true
Code language: JavaScript (javascript)
instanceof 演算子と継承
次の例では、Person
クラスを拡張するEmployee
クラスを定義します。
class Person {
constructor(name) {
this.name = name;
}
}
class Employee extends Person {
constructor(name, title) {
super(name);
this.title = title;
}
}
let e1 = new Employee();
console.log(e1 instanceof Employee); // true
console.log(e1 instanceof Person); // true
console.log(e1 instanceof Object); // true
Code language: JavaScript (javascript)
e1
はEmployee
クラスのインスタンスであるため、Person
クラスとObject
クラス(基底クラス)のインスタンスでもあります。
Symbol.hasInstance
ES6では、instanceof
演算子はSymbol.hasInstance
関数を使用して関係を確認します。Symbol.hasInstance()
はオブジェクトを受け取り、型がそのオブジェクトをインスタンスとして持つ場合にtrue
を返します。例えば
class Person {
constructor(name) {
this.name = name;
}
}
let p1 = new Person('John');
console.log(Person[Symbol.hasInstance](p1)); // true
Code language: JavaScript (javascript)
Symbol.hasInstance
はFunction
プロトタイプで定義されているため、デフォルトですべての関数とクラスで自動的に使用できます。
サブクラスでSymbol.hasInstance
を静的メソッドとして再定義できます。例えば
class Person {
constructor(name) {
this.name = name;
}
}
class Android extends Person {
static [Symbol.hasInstance]() {
return false;
}
}
let a1 = new Android('Sonny');
console.log(a1 instanceof Android); // false
console.log(a1 instanceof Person); // false
Code language: JavaScript (javascript)
まとめ
- オブジェクトのプロトタイプチェーン内の
constructor.prototype
を確認するには、instanceof
演算子を使用します。