instanceof演算子で親クラスと子クラスを比較判定する

developer.mozilla.org

JSの自作クラスの型判定に instanceof 演算子を使ったりするが、この演算子を用いて親クラスと子クラスを比較すると true を返す。

例えば、親クラスとしてFooクラスを、子クラスとしてFooクラスを継承したBarクラスを作成し、Fooクラスに同じクラス型かどうかを判定するequalsメソッドを実装してみる。

class Foo {
  equals(object) {
    console.log(object); // Bar {}
    console.log(object.constructor); // [Function: Bar]
    console.log(this.constructor); // [Function: Foo]

    // 右辺はBarオブジェクト、左辺はFooオブジェクト関数
    return object instanceof this.constructor;
  }
}

class Bar extends Foo {
}

console.log(new Foo().equals(new Bar())); // true

両者を区別したいなら、オブジェクト関数同士を === 演算子で比較する。

class Foo {
  equals(object) {
    ...
    return object.constructor === this.constructor;
    // return object instanceof this.constructor;
  }
}
...
console.log(new Foo().equals(new Bar())); // false