日期:2014-05-16  浏览次数:20454 次

JavaScript学习笔记(十五) 对象即时初始化

对象即时初始化(Immediate Object Initialization)

另一种可以防止全局作用域"污染",和前面的数的立即执行函数类似,就是对象即时初始化(Immediate Object Initialization)模式;
这种模式使用一个带init()方法的对象,init()在对象创建后被立即执行;
这个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()方法调用包裹进小括号中,而不是仅仅只包含对象;
换言之,就是下面这两种情况都能正常工作:
({...}).init();
({...}.init());
这种模式的好处和立即执行函数模式一样:当你执行一次性的初始化工作时,保护了全局作用域(没有增加全局变量);
在语法上,对象即时初始化看起来可能比仅包裹的一段代码匿名函数要复杂些;
但如果你的初始化工作更加复杂(实际上它们经常这样),会向整个初始化过程添加代码;
例如:私有的辅助函数都会清楚的被区分出来,因为他们都是这个临时对象的属性;
然而在立即执行函数中,它们很可能就是分散的函数。

这种模式的一个缺点就是绝大部分JavaScript压缩工具压缩这种模式的时候没有压缩在函数的中的代码有效率;
私有属性和方法不会被重命名更短的名称,因为从压缩工具的角度,这样是不安全的。

这种模式主要适合一次性的工作,并且这个对象在init()调用完成方法结束之后就不会再被访问;
如何你想在init()方法执行之后持有这个对象的引用,你可以很简单的实现这个功能,通过在init()方法的末尾加上 return this;