【入門編】 instanceof演算子の内部メカニズムとSymbol.hasInstance – JavaScript実践ガイド

こんにちは!フロントエンドの世界へようこそ。
JavaScriptを触り始めて、「あれ、これって何者?」と迷子になることは誰にでもあります。特に「型」の判定は、プロの現場でも慎重になるくらい奥が深い場所。

今日は、そんなJavaScriptの不思議な仕組みの中でも、ちょっとだけ「裏側の魔法」を覗くような`instanceof`演算子と、それをカスタマイズできる`Symbol.hasInstance`について、一緒に紐解いていきましょう。

—

1. `instanceof`って、結局なにをしているの?

`instanceof`は、一言で言えば「あなたは、この一族の出身ですか?」と尋ねるための演算子です。

例えば、あなたが買った「スマートフォン」が「Apple製品」かどうかを確認したいとします。そのとき、箱の裏を見るだけで分かりますよね。JavaScriptの世界でも同じで、あるオブジェクトが特定のクラス(設計図)から作られたものなのかを確かめることができます。

泥臭いプロトタイプチェーンの話

内部では、JavaScriptは「プロトタイプチェーン」という長い数珠繋ぎを辿っています。

1. 「あなた、この設計図で作られた?」と聞く。
2. 「いいえ、私はその親の設計図から作られた子です」と答える。
3. 「じゃあ、あなたの親のそのまた親は?」と、ずっと遡っていく。

この数珠繋ぎを最後まで辿って、もし設計図が見つかれば`true`、見つからなければ「赤の他人ですね」ということで`false`が返ってくる。これが`instanceof`の正体です。

class Pet {}
class Dog extends Pet {}

const myDog = new Dog();

// myDogはDogの一族? -> はい!
console.log(myDog instanceof Dog); // true

// myDogはPetの一族? -> はい、親ですからね!
console.log(myDog instanceof Pet); // true

—

2. もっと自由に!`Symbol.hasInstance`という隠し技

普通は`instanceof`の結果はJavaScriptが勝手に決めてくれますが、時には「ルールを自分で書き換えたい!」と思うこともあるでしょう。

例えば、「たとえ血縁関係がなくても、特定の条件を満たせば『仲間』とみなす」といった柔軟な判定が必要なときです。ここで登場するのが、魔法の鍵である`Symbol.hasInstance`です。

これは、`instanceof`が呼ばれた瞬間に「裏でこっそり実行される関数」を指定できるという、非常に強力なフックなんです。

例え:VIP専用の入り口を作る

通常の`instanceof`は厳格なガードマンですが、`Symbol.hasInstance`を使うと、「特定のバッジ(プロパティ)を持っている人なら、誰でもVIPとして通してあげるよ!」というルールに変更できます。

class VIPChecker {
// 静的メソッドとして定義するのがポイント!
static [Symbol.hasInstance](instance) {
// もしインスタンスが ‘isVIP’ という属性を持っていれば、
// 親子関係を無視して true を返す!
return !!instance.isVIP;
}
}

const guestA = { isVIP: true };
const guestB = { isVIP: false };

// 通常なら false なはずなのに、ルールを書き換えたので true になる!
console.log(guestA instanceof VIPChecker); // true
console.log(guestB instanceof VIPChecker); // false

—

3. 初学者がつまずきやすい「落とし穴」

ここで一つだけ、絶対に覚えておいてほしい注意点があります。

`instanceof`は、プリミティブ型(数値や文字列など)には効きません。

console.log(“hello” instanceof String); // false

「えっ、文字列なのに!」と驚くかもしれませんが、`”hello”`はオブジェクトではなく、ただの「値」だからです。`instanceof`はあくまで「オブジェクトの家系図」を辿るための道具。プリミティブ型を判定したいときは、おとなしく `typeof` を使ってくださいね。

—

最後に:完璧を目指さなくて大丈夫

JavaScriptの型判定は、非常に自由度が高い一方で、少しだけ複雑です。最初からすべてを完璧に理解する必要なんてありません。

  • まずは「`instanceof`は家系図を辿るんだな」とイメージする。
  • 「どうしても特殊な判定がしたいときには`Symbol.hasInstance`という裏口があるんだな」と名前だけ覚えておく。

これだけで、あなたはもう他の初心者よりもずっと深いレベルに立っています。コードを書くとき、もし迷ったら「これは今、家系図を辿っているのかな?」と一息ついて考えてみてください。

もし行き詰まったら、いつでもまたここに戻ってきてくださいね。あなたのエンジニアライフを、心から応援しています!

コメント

タイトルとURLをコピーしました