これはカプセル化を破りませんか?
はいといいえ。クロージャを使用する場合でも、インスタンス化時に宣言されたオブジェクトの関数の外部からアクセスできないという意味で、「プライベート」変数を使用できます。例:
var ObjectPrototype = function () {
var privateVariable = "closure-scope value";
var InnerPrototype = function () {
this.getPrivate = function () { return privateVariable; };
};
return new InnerPrototype();
};
var myObject = new ObjectPrototype();
ObjectPrototype
はの新しいインスタンスを返し、クロージャー内にのみ存在するため、外部から直接アクセスする方法はInnerPrototype
ありprivateVariable
ません。その値を取得する唯一の方法は、を使用することです。ObjectPrototype
privateVariable
myObject.getPrivate()
注:Javascriptはオブジェクトと配列を参照によって渡すため、このメソッドは単純な値のみを本当に保護します(代わりにクローンを返すように注意しない限り)。
プログラムの他の部分が新しいプロパティを追加し続けて、オブジェクトの作成がかさばる場合はどうなりますか?
それはあなたがただ注意を払う必要があるものです。
誰かが私によって定義されたプロパティを削除/変更した場合はどうなりますか?
これを防ぐために、上記で説明したクロージャースコープ方式を使用してください。