4

私はJSの初心者で、理解のためにJavascript Patternsという本を読んでいます。私が見ることができるコードスニペットの1つ:

var myFunc = function param() {
...
...
};
myFunc.cache={};

これは、関数本体以外の誰でも新しいプロパティを追加できることを示しています。これはカプセル化を壊しませんか? プログラムの他の部分が新しいプロパティを追加し続け、オブジェクトの作成がかさばる場合はどうなりますか? 私が定義したプロパティを誰かが削除/変更した場合はどうなりますか?

これを「問題」と呼ぶのが正しいかどうかはわかりません。しかし、そうである場合は、これを回避するためのアプローチを手伝ってください。

ありがとう !

4

3 に答える 3

4

JavaScriptには、オブジェクトを保護するためのオプションが実際にはありませんでしたが、ECMAScript 5以降、オブジェクトをフリーズできるようになりました。

var o = { a: 1, b: 2 };
Object.freeze(o);
console.log(o.a); // 1
o.a = 2;
console.log(o.a); // 1

エラーがスローされる可能性がある厳密モードと呼ばれる新しいコンテキストもあります。

function processObject(o) {
    "use strict";
    delete o.a; // throws a TypeError
}
于 2012-08-29T06:41:05.590 に答える
1

これはカプセル化を破りませんか?

はいといいえ。クロージャを使用する場合でも、インスタンス化時に宣言されたオブジェクトの関数の外部からアクセスできないという意味で、「プライベート」変数を使用できます。例:

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ません。その値を取得する唯一の方法は、を使用することです。ObjectPrototypeprivateVariablemyObject.getPrivate()

注:Javascriptはオブジェクトと配列を参照によって渡すため、このメソッドは単純な値のみを本当に保護します(代わりにクローンを返すように注意しない限り)。

プログラムの他の部分が新しいプロパティを追加し続けて、オブジェクトの作成がかさばる場合はどうなりますか?

それはあなたがただ注意を払う必要があるものです。

誰かが私によって定義されたプロパティを削除/変更した場合はどうなりますか?

これを防ぐために、上記で説明したクロージャースコープ方式を使用してください。

于 2012-08-29T06:56:37.917 に答える
0

新しいプロパティはいつでも追加できますが、必ずしも悪いことではありません。実装をオーバーライドする機能は非常に強力です。

通常、関数プロトタイプにメソッドやオブジェクトなどを追加したいので、試してみてください

myFunc.prototype.cache = {};

最終的には、モジュール パターンのようなものに従いたいと思うでしょう。

http://www.yuiblog.com/blog/2007/06/12/module-pattern/

http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

モジュールパターンを使用すると、クロージャーを介してデータへの特権アクセスを持つ「プライベート」メンバーを作成できます。

于 2012-08-29T06:50:27.903 に答える