こんにちは。JavaScriptの世界へようこそ。
コードを書いていると、「あれ?さっきまで見えていたはずの箱(変数)が、どこかに行っちゃったぞ?」なんて経験、一度はありますよね。
今日は、そんな「スコープ(見通せる範囲)」の悩みの中でも、ちょっと特別な「プライベートクラスフィールド(#で始まる変数)」について、お話ししたいと思います。
難しい話は抜きにして、まずは身近な「お財布」をイメージしてみてください。
—
1. クラスは「お店」、プライベートフィールドは「店主の秘密の金庫」
JavaScriptの「クラス」というのは、お店のようなものだと考えてください。その中で「#」をつけて宣言する変数は、「店主しか触れない秘密の金庫」です。
class MyShop {
// #がついているから、外からは絶対に開けられない秘密の金庫
#secretMoney = 1000;
showMoney() {
console.log(`今の所持金は${this.#secretMoney}円です!`);
}
}
const shop = new MyShop();
shop.showMoney(); // OK: 店主(クラスの中)なので中身が見える
// console.log(shop.#secretMoney);
// !!エラー発生!!
// 「そんなの知らないよ!」と怒られます。外からは見えないからです。
なぜ外から見えないのか? それは、この変数が「そのクラスという『建物』の中だけで生きている」と決まっているからです。外の世界からは、その金庫の存在すら隠されているんですね。
2. なぜ「#」が必要なの?
昔のJavaScriptでは、外から見えないようにするために色々な工夫をしていました。でも、どれも「完璧に隠す」のは難しかったんです。
そこで登場したのが、この「#(ハッシュ)」です。これをつけると、JavaScriptのエンジンが「これは絶対にクラスの外には漏らさないよ」と強力なロックをかけてくれます。
もしあなたが誰かに、「この金庫の中身を書き換えて!」と頼んでも、コード自体が「そんな金庫は存在しません」と門前払いしてくれる。だから、プログラムの予期せぬ事故(誰かが勝手に大事なデータを書き換えてしまうこと)を防げるんです。
3. スコープという「視界」の正体
プライベートフィールドのスコープは、「そのクラスの定義ブロックの中だけ」という、非常に狭い視界を持っています。
これは、夜の公園で懐中電灯を照らすイメージに近いです。「#」がついた変数は、その懐中電灯の光が届く範囲(クラスの `{ }` の中)でしか存在しません。光が届かない場所(クラスの外)にいる人には、その変数が見えることはありません。
ちょっとした注意点:ここが「つまずきポイント」!
初学者の方がよくやってしまうのが、「外から無理やりアクセスしようとしてしまう」ことです。
class SecretBox {
#code = 1234;
// 外に持ち出したい時は、必ず「窓口(メソッド)」を通すこと!
getCode() {
return this.#code;
}
}
const box = new SecretBox();
// box.#code を直接触ろうとせず、窓口を使おうね
console.log(box.getCode()); // これなら安全に中身を確認できます
「直接触らせてくれないなんて不便だな」と思うかもしれませんが、これは「大事なデータを勝手に壊されないためのバリア」です。安心して開発を進めるために、あえて「窓口を通す」というルールを守るのが、プロの流儀なんですよ。
4. 今日のまとめ:大丈夫、一歩ずつでいいんです
プライベートフィールド(`#`)について、少しイメージは湧きましたか?
- `#` がつくと、外からは絶対に見えない「秘密の金庫」になる。
- 外から中身を知りたい時は、クラスの中に「窓口」を作ってあげる。
- 「エラーが出る」のは、あなたが間違えたからではなく、JavaScriptがしっかり守ってくれている証拠。
最初は「なんだかややこしいな」と思うかもしれません。でも、この仕組みのおかげで、規模の大きなプログラムを作るときでも、迷子にならずに安心してコードを書けるようになるんです。
もしエラーが出ても、「あ、今はクラスの外から秘密を覗こうとしちゃったんだな」と気づければ、あなたはもう立派なアーキテクトの卵です。
焦らず、少しずつこの「隠す」というテクニックを楽しんでいってくださいね。また何かあれば、いつでも聞きに来てください。応援していますよ!

コメント