爲什麼不建立它有點刻意?
// 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;
}());
我通過明確命名的返回,公共對象的麻煩去,但它現在已經非常清楚是什麼,是不公開的,然而,這些東西每個人將有機會獲得的變量版本除了一個例外,如果你改變myModule.myInt
或publicData
,它們將不再相等。
爲了證明我的意思在下面的意見,創建自己的私有數據/方法的多個實例,我只添加的功能範圍內多了一個層:
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;
}());
現在你有隻寫一個「私」功能時間(即:節省內存),但任何實例都可以使用這些函數。
這裏的漁獲:
由於範圍和封閉的工作方式,靜態功能有NO訪問值內的實例(函數內部可以訪問靜態函數中,而不是相反)。
因此,任何靜態輔助功能MUST必須傳遞給它們的參數的值,如果你正在修改一個數字或字符串,你MUST的價值迴歸這一職能的。
// inside of a private method, in any instance
var privateString = "Bob",
privateFunc = function() {
var string = static_helper(privateString);
privateString = string;
//...
};
'someOtherFunc.call(this)'而不是'someOtherFunc()'。 –