伟大的行动和思想

带你走进JavaScript世界系列——其他模式介绍

2019-09-23来源:西安之声

前面的文章我们已经介绍了构造函数模式和原型模式,接下来我们将介绍剩下的其他几种模式。

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

创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混合模式还支持像构造函数传递参数。例:

带你走进JavaScript世界系列——其他模式介绍

构造函数模式与原型模式组合

在上面的例子的中,实例属性都是在构造函数中定义的,而由所有实例共享属性 constructor 和方法 sayName() 则是在原型中定义的。而修改了 p1.friends 属性,并不会影响到 p2.friends 属性,因为它们分别引用了不同的数组。这种构造函数与原型混合模式,是目前ECMAScript 中使用最广泛,认同度最高的一种创建自定义类型的方法。

动态原型模式

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

带你走进JavaScript世界系列——其他模式介绍

动态原型模式

上面的代码示例中对原型所做的修改,能够立即在所有实例中得到反映。不过需要注意的是:使用动态原型模式,不能使用对象字面量重写原型(具体原因,请看上一篇文章)。

寄生构造函数模式

通常,在前面几种模式都不适用的情况下,可以使用寄生构造函数模式。这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象,但从表面上看,这个函数又很像是典型的构造函数。例:

带你走进JavaScript世界系列——其他模式介绍

寄生构造函数模式

上面的代码演示了寄生构造函数模式,除了使用 new 操作符并把使用的包装函数叫做构造函数之外,这个模式跟工厂模式是一摸一样的。这种模式可以在特殊的情况下用来为对象创建构造函数。假如我们想创建一个具有额外方法的特殊数组,由于不能直接修改 Array 构造函数,因此我们可以使用这种模式。例:

带你走进JavaScript世界系列——其他模式介绍

寄生构造函数模式用例

关于寄生构造函数模式需要说明的是,返回的对象与构造函数或者构造函数的原型属性之间没有关系,也就是说,构造函数返回的对象与在构造函数外部创建的对象没有什么不同。因此,不能通过 instanceof 操作符来确定对象类型。由于存在上述问题,在能使用其他模式的情况下,尽量不用使用这种模式。

稳妥构造函数模式

介绍这个模式之前,我们先来简单介绍一下什么是稳妥对象。所谓稳妥对象,指的是没有公共属性,而且其方法也不能引用this的对象。稳妥对象最适合在一些安全的环境中,或者在防止数据被其他应用程序修改时使用。稳妥构造函数模式与寄生构造函数模式类似,但是又有着不同:首先,新创建对象的实例方法不引用this,其次,不使用 new 操作符调用构造函数。例:

带你走进JavaScript世界系列——其他模式介绍

稳妥构造函数模式

亚游集团最新版下载|平台上面的代码演示了稳妥构造函数模式,变量 p 中保存的是一个稳妥对象,除了调用 sayName() 方法外,没有别的方式可以访问其数据成功。即使有其他的代码会给这个对象添加方法或数据成员,但也不可能有别的办法访问传入到构造函数中的原始数据。稳妥构造函数模式提供的这种安全性,使得它非常适合在某些安全执行环境。稳妥构造函数模式存在与寄生构造函数模式一样的问题。

转载文章地址:http://www.igzys.com/guoxue/43225.html
(本文来自伟大的行动和思想整合文章:http://www.igzys.com)未经允许,不得转载!
标签:
JavaScript ECMAScript 文章
网站简介 联系我们 网站申明 网站地图

版权所有:www.igzys.com ?2017 伟大的行动和思想

伟大的行动和思想提供的所有内容均是网络转载或网友提供,本站仅提供内容展示服务,不承认任何法律责任。