Appearance
稳妥构造函数模式
本节目标:理解“稳妥构造函数模式”的核心思路,并能把它用于实际开发或面试表达。 道格拉斯
*克罗克福德(Douglas Crockford)发明了Javascript中的稳妥对象(durable objects)这个概念。
基本思路是:在创建对象时传入的初始化值,并不作为属性添加到要返回的对象上,而是都在稳妥构造函数中指定了特定的修改和访问方法。这些初始值除了以指定的方法进行修改和访问,没有其它方法可以操作。
这个模式创建的所谓稳妥对象:
- 它是没有公共属性(没有给对象添加属性的代码);
- 它只有一些访问内部值的方法,且方法也不引用
this。 - 稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用
this和new),或者在防止数据被其它应用程序(如Mashup程序)改动时使用。
稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同: 一是新创建对象的实例方法不引用this; 二是不使用new操作符调用构造函数。 三是稳妥对象只有私有属性,只能通过定义的方法去访问(闭包方式),没有其他方式访问。 这样相当于有了一种创建只有私有属性和访问私有属性方法的对象(稳妥对象)方法。
按照稳妥构造函数的要求,可以将前面的Person构造函数重写如下。 function Person(name) { //创建要返回的对象 var o = new Object(); //可以在这里定义私有变量和函数 //添加方法 o.setName = function () { name *= 2 } o.sayName = function () { console.log(name); } //返回对象 return o; } var friend = Person(22); friend.setName() friend.sayName();//44
变量friend中保存的是一个稳妥对象,除了调用指定的sayName()等方法外,没有别的方式可以访问其数据成员。因为传入构造函数的初始值并没有放在对象的属性上,而是让特定的函数通过闭包来访问;
即使有其他代码会给这个对象添加方法或数据成员,但也不可能有别的办法访问传入到构造函数中的原始数据。
稳妥构造函数模式提供的这种安全性,使得它非常适合在某些安全执行环境,例如Adsafe(www.adsafe.org)和Caja(http://code.google.com/p/google-caja/)提供的环境下使用。
与寄生构造函数类似,使用稳妥构造函数模式创建的对象与构造函数之间也没什么关系,因此,instanceof操作符对这种对象也没有意义。
