パブリック、保護、プライベートのスコープ
従来のオブジェクト指向プログラミングでは、主な焦点はパブリック スコープとプライベート スコープにあります。パブリック スコープ内のオブジェクト プロパティには、オブジェクトの外部からアクセスできます。つまり、開発者はオブジェクトのインスタンスを作成した後、そのパブリック プロパティを使用できます。プライベート スコープのプロパティはオブジェクト内でのみアクセスできます。つまり、外部には存在しません。これは、クラスがプライベート プロパティとメソッドを定義している場合、そのサブクラスからはそれらのプロパティとメソッドにアクセスできないことも意味します。
最近、別のタイプのスコープである保護スコープが人気になっています。保護スコープを適用するためのルールは言語によって異なりますが、一般的に、プライベート プロパティとメソッドを定義するために使用されますが、これらのプロパティとメソッドはそのサブクラスからもアクセスできます。
ECMAScript にはパブリック スコープという 1 種類のスコープしかないため、ECMAScript でこれらのスコープについて議論することはほとんど無意味です。 ECMAScript のすべてのオブジェクトのすべてのプロパティとメソッドはパブリックです。したがって、独自のクラスとオブジェクトを定義するときは注意が必要です。すべてのプロパティとメソッドはデフォルトでパブリックであることに注意してください。
多くの開発者が、ECMAScript のこの問題を解決するために、インターネット上で効果的な属性スコープ パターンを提案してきました。プライベート スコープが欠如しているため、開発者はどのプロパティとメソッドをプライベートと見なすべきかを示す規約を開発しました。この規則では、属性名の前後にアンダースコアを付ける必要があります。例:
このコードでは、属性の色はプライベートです。これらのアンダースコアは、これらのプロパティがパブリックであるという事実を変更するものではなく、プロパティをプライベートとして扱う必要があることを他の開発者に伝えるだけであることに注意してください。
一部の開発者は、obj._color などのプライベート メンバーを記述するために単一のアンダースコアを使用することを好みます。
静的スコープは静的ではありません
静的スコープで定義されたプロパティとメソッドには、いつでも同じ場所からアクセスできます。 Java では、クラスに静的なプロパティとメソッドを含めることができ、これらはクラスのオブジェクトをインスタンス化せずにアクセスできます。たとえば、java.net.URLEncoder クラスの関数 encode() は静的メソッドです。
厳密に言えば、ECMAScript には静的スコープがありません。ただし、コンストラクターにプロパティとメソッドを提供することはできます。コンストラクターは単なる関数であることに注意してください。関数はオブジェクトであり、オブジェクトにはプロパティとメソッドを持つことができます。例:
ここで、alternate() メソッドは実際には関数 SayHi のメソッドです。通常の関数のように、sayHi() を呼び出して「hi」を出力することも、sayHi.alternate() を呼び出して「hola」を出力することもできます。それでも、alternate() は、sayHi() のパブリック スコープ内のメソッドであり、静的メソッドではありません。