第6章:创建对象的各种模式

6.2.4 组合使用构造函数模式和原型模式

创建自定义类型的最常用方式,就是组合使用构造函数模式和原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。这样的话,每个实例都会有自己的一份实例属性的副本,但同时又共享这对方的引用,最大限度的节省了内存。另外,这种混成模式还支持想构造函数传递参数,可谓是集合两种模式之长。


组合使用构造函数模式和原型模式

组合使用构造函数模式和原型模式,是目前ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法。这是用来定义引用类型的一种默认模式。

6.2.5 动态原型模式

动态原型模式把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型对象(仅在必要情况下),又保持了同时使用构造函数和原型的优点。(通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型)


动态原型模式

在上面的例子中, sayName 方法只有只有在不存在的情况下菜会将它添加到原型中。添加sayName方法的这段代码只有在初次调用构造函数时才会执行。此后,原型已经完成初始化,不需要在做什么修改了。其中 if 语句检查的是初始化之后应该存在的任何属性或方法——不必用一大堆 if 语句检查每个属性和方法:只需要检查一个即可。对于采用这种模式创建的对象,还能用 instanceof 操作符确定它的类型。

注意:使用动态原型模式时,不能使用对象字面量重写原型对象。如果在已经创建了实例的情况下重写原型对象,那么就会切断现有实例与新原型之间的联系

6.2.6 寄生构造函数模式

寄生构造函数模式的思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后在返回新创建的对象。


寄生构造函数模式

利用寄生构造函数模式创建一个具有额外方法的特殊数组。


SpecialArray

如上图所示,首先创建一个叫做SpecialArr的构造函数。在函数内部,首先创建一个数组,然后push()方法(用函数的arguments对象接收到的参数) 初始化数组。然后给数组实例添加一个 toPipedString() 方法,该方法返回以竖线分隔的数组值。然后将数组值以函数的形式返回。

注意:返回的对象与构造函数或者与构造函数的原型属性之间没有关系。(构造函数返回的对象与在构造函数外部创建的对象没有什么不同,为此不能使用 instanceof 操作符来确定对象类型)。

不推荐使用

6.2.7 稳妥构造函数模式

JavaScript中的稳妥对象概念:没有公共属性,而且其它方法也不能引用 this 的对象。稳妥对象最适合在一些安全的环境中(这些环境会禁止使用 this 和 new),或者在防止数据被其它引用程序改动时使用;二是不使用 new 操作符调用构造函数。


稳妥构造函数模式

如图,变量 person中保存着一个稳妥对象,而除了调用sayName()方法外,没有别的方式可以访问其数据成员。即使有其它代码会给这个对象添加方法或数据成员,但也不可能有别的办法访问传入到构造函数中的原始数据。

注意:与寄生构造函数一样,使用稳妥构造函数模式创建的对象与构造函数之间也没有什么关系,为此不能使用 instanceof 操作符来确定对象类型)。

你可能感兴趣的:(第6章:创建对象的各种模式)