JavaScript學習筆記(十五) 對象即時初始化

對象即時初始化(Immediate Object Initialization)
另一種可以防止全局作用域"污染",和前面的數的立即執行函數類似,就是對象即時初始化(Immediate Object Initialization)模式;
這種模式使用一個帶init()方法的對象,init()在對象創建後被立即執行;
這個init()方法會完成所有的初始化工作:
[javascript]
({ 
// here you can define setting values  
// a.k.a. configuration constants  
maxwidth: 600, 
maxheight: 400, 
// you can also define utility methods  
gimmeMax: function () { 
return this.maxwidth + "x" + this.maxheight; 
}, 
// initialize  
init: function () { 
console.log(this.gimmeMax()); 
// more init tasks…  

}).init(); 

({
// here you can define setting values
// a.k.a. configuration constants
maxwidth: 600,
maxheight: 400,
// you can also define utility methods
gimmeMax: function () {
return this.maxwidth + "x" + this.maxheight;
},
// initialize
init: function () {
console.log(this.gimmeMax());
// more init tasks…
}
}).init();從語法角度來說,使用這種模式很像使用對象字面量聲明一個普通對象;
你也可以將字面量包裹在一對括號中,這可以告知JavaScript引擎將這對大括號作為對象字面量處理,而不是代碼塊;
當你在結束小括號之後,就立即調用init()方法。

你也可以講init()方法調用包裹進小括號中,而不是僅僅隻包含對象;
換言之,就是下面這兩種情況都能正常工作:
[javascript]
({…}).init(); 
({…}.init()); 

({…}).init();
({…}.init());這種模式的好處和立即執行函數模式一樣:當你執行一次性的初始化工作時,保護瞭全局作用域(沒有增加全局變量);
在語法上,對象即時初始化看起來可能比僅包裹的一段代碼匿名函數要復雜些;
但如果你的初始化工作更加復雜(實際上它們經常這樣),會向整個初始化過程添加代碼;
例如:私有的輔助函數都會清楚的被區分出來,因為他們都是這個臨時對象的屬性;
然而在立即執行函數中,它們很可能就是分散的函數。 www.aiwalls.com

這種模式的一個缺點就是絕大部分JavaScript壓縮工具壓縮這種模式的時候沒有壓縮在函數的中的代碼有效率;
私有屬性和方法不會被重命名更短的名稱,因為從壓縮工具的角度,這樣是不安全的。

這種模式主要適合一次性的工作,並且這個對象在init()調用完成方法結束之後就不會再被訪問;
如何你想在init()方法執行之後持有這個對象的引用,你可以很簡單的實現這個功能,通過在init()方法的末尾加上 return this;

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *