•ブロックレベルのスコープをシミュレートする
JavaScript にはブロックレベルのスコープの概念がないことは誰もが知っています。次の例を参照してください。
(function () {
for (var i = 0; i //何もしない
}
alert(i) //出力 10
})();
行 6 は、ループ ブロック内の変数 i で、上記のコードを少し変更して for ループ ブロックをクロージャ内に配置すると、状況は異なります。
(function () {
(function () {
for (var i = 0; i //何もしない
}
})();
alert(i) //エラー: 'i' が未定義です
})(); >
8 行目の変更された i にアクセスすると、エラーが発生し、必要なブロックレベルのスコープが達成されました。
•プライベートプロパティ
JavaScriptにはブロックレベルのスコープの概念はなく、プライベートプロパティの概念もありませんが、プライベート変数は存在します。一部のデータをカプセル化して非表示にしたい場合はどうすればよいでしょうか?クロージャとプライベート変数を使用してオブジェクトのプライベート プロパティを実装できると考えたことがあるかもしれません。
. インスタンスのプライベート属性
インスタンスのプライベート属性の特徴は、各オブジェクトに独立した属性が含まれ、オブジェクト間で共有がないことです。この目標を達成するには、他の OO 言語のセッターとゲッターと同様に、コンストラクターにプライベート変数を追加し、このプライベート変数にアクセスするパブリック メソッドを定義します。次の例では、インスタンスのプライベート プロパティを実装します。
//プライベート変数のインスタンス
関数MyObject(name) {
//プライベート変数を定義します
//注意: this.name を使用すると、パブリック プロパティ
var privateName = name; になります。 >//プライベート ファミリアリティを定義します
var privateFunction = function () {
return "プライベート関数";
}
//パブリック メソッド アクセス プライベート ファミリアリティ
MyObject.prototype.getName = function ( ) {
return privateName;
}
MyObject.prototype.getFunction = function () {
return privateFunction();
}
}
var moGyy = new MyObject( "gyy");
alert (moGyy.getName()); // 出力 gyy
alert(moGyy.getFunction()); // 出力プライベート関数
var moCyy = new MyObject("cyy") );
alert(moCyy. getName()); // cyy を出力します。
alert(moCyy.getFunction()); // 2 つのオブジェクトのプライベート関数
を出力します。と 上記の例で作成された moCyy は異なる値を返します。プライベート メソッドを呼び出したい場合は、パブリック インターフェイスも必要です。上記の例で、2 つのパブリック関数がプライベート変数にアクセスできるのは、2 つのパブリック関数がクロージャであり、クロージャのスコープ チェーンにその関数を含む変数オブジェクトが含まれているためです。したがって、変数を検索するときは A スコープが使用されます。チェーンを使用すると、それを含む関数内のプライベート変数にアクセスできます。上記の例では、オブジェクトが作成されるたびに同じ機能を持つ 2 つの関数インスタンスが作成されるのを防ぐために、パブリック メソッドが MyObject のプロトタイプに追加されています。
<2>. 静的プライベート属性
場合によっては、データをグローバルに共有する必要がある場合でも、この属性をプライベートにする必要があるため、静的プライベート属性を実装する方法を説明します。 ? ?まず、このプライベートはコンストラクターの外側にある必要があります。コンストラクターの外側の変数とコンストラクターを統合するには、内部変数にアクセスするために、クロージャーを使用してプライベート変数とコンストラクターの両方を含めます。次のコード例に示すように、クロージャ コンストラクタの外側では、グローバル変数を使用してコンストラクタを参照できます。