もう少し意図的に構築してみませんか?
// this one returns an object used like:
// myModule.myInt; /* 456 */
// myModule.myFunc(); /* 124 */
var myModule = (function () {
var secretData = 123,
publicData = 456,
publicFunc = function () { return privateFunc(secretData); },
privateFunc = function (num) { return num + 1; },
public_interface = {
myInt : publicData,
myFunc : publicFunc
};
return public_interface;
}());
返されたパブリック オブジェクトに明示的に名前を付けるというトラブルを経験しましたが、何がパブリックで何がパブリックではないかが非常に明確になりましたが、これらのそれぞれは、1 つの例外を除いて、互いの変数バージョンにアクセスできます。myModule.myInt
またはを変更するpublicData
と、それらは等しくなくなります。
以下のコメントで私が何を意味するかを示すために、独自のプライベート データ/メソッドを使用して複数のインスタンスを作成し、関数スコープのレイヤーをもう 1 つ追加します。
var myModule = (function () {
var static_int = 789,
makeInstance = function (/* any constructor values */) {
var secretData = 123,
publicData = 456,
publicFunc = function () { return privateFunc(secretData); },
privateFunc = function (num) {
console.log(static_int);
return num + 1;
},
public_interface = {
myInt : publicData,
myFunc : publicFunc
};
return public_interface;
};
return makeInstance;
}());
次のように使用します。
var newModule = myModule(/* instance parameters */);
newModule.myFunc();
...また
var num = myModule(/* instance parameters */).myFunc();
メモリを節約したい場合は、静的レイヤー内に静的ヘルパー関数を含めることができます。
var myModule = (function () {
var static_int = 789,
static_addOne = function (num) { return num + 1; },
static_divideBy = function (dividend, divisor) { return dividend/divisor; },
makeInstance = function (/* any constructor values */) {
var secretData = 123,
publicData = 456,
publicFunc = function () { return privateFunc(secretData); },
privateFunc = function (num) {
console.log(static_int);
return num + 1;
},
public_interface = {
myInt : publicData,
myFunc : publicFunc
};
return public_interface;
};
return makeInstance;
}());
これで、一度しか書き込まれない (つまり、メモリを節約する) 「プライベート」関数ができましたが、どのインスタンスでもそれらの関数を使用できます。
キャッチは次のとおりです。
スコープとクロージャーの仕組みにより、静的関数はインスタンス内の値にアクセスできません (内部の関数は静的関数にアクセスできますが、その逆はできません)。
そのため、静的ヘルパー関数には引数として渡された値が必要であり、数値または文字列を変更する場合は、その関数から値を返さなければなりません。
// inside of a private method, in any instance
var privateString = "Bob",
privateFunc = function () {
var string = static_helper(privateString);
privateString = string;
//...
};