Open1

JavaScriptのinstanceofってやっぱり使いにくい

suinsuin

object instanceof Constructorでオブジェクトがクラスのインスタンスかを調べられる。

一見便利そうだが、こういうケースもあるので使いにくい。

  • プロジェクトでlibAを使っている
  • libA → libBのFooインスタンスを返す
  • instanceof Fooしたいので、libBをプロジェクトにインストール
  • libAが期待するlibBのバージョンと、プロジェクトが指定したlibBのバージョンが異なるため、libBがnode_modulesに2つ存在
    • 前者をlibB-1、後者をlibB-2とする
  • プロジェクトでinstanceof FooはlibB-2のFooを見に行っている
  • しかし、libAが返すFooはlibB-1のもの。
  • したがって、常にfalseが返る。

プロジェクトで指定したlibBのバージョンをlibAと合わせれば一時的には解決する。しかし、libAがいつlibBのバージョンを変更するか分からないという問題もある。

instanceofに頼らず、型ガード関数で判別するのが安全。