JS--面向对象之寄生构造函数模式和稳妥构造函数模式

首先今天先介绍一个新的模式,寄生(parasitic)构造函数模式,其基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象。先看看如下代码:


JS--面向对象之寄生构造函数模式和稳妥构造函数模式_第1张图片

从这段代码中,我们应该感觉很熟悉,是不是和我们的工厂模式创建对象的模式很像,我们在看下工厂模式是如何进行创建对象的:


JS--面向对象之寄生构造函数模式和稳妥构造函数模式_第2张图片

对比一下我们可以看到工厂模式和寄生模式的区别,寄生模式比工厂模式要怪异的地方是其使用new操作符并把包装函数叫做构造函数。

构造函数在不返回值得情况下,默认会返回新对象实例。(表示这句话没有弄得太清楚,知道的大神请帮忙解答一下。)而通过构造函数末尾添加return语句,可以重写调用构造函数时候的返回值。

看下该模式的实际应用,如果我们想创建一个有特殊方法的数组:


JS--面向对象之寄生构造函数模式和稳妥构造函数模式_第3张图片


注意:寄生构造函数模式,返回的对象与构造函数或者构造函数的原型属性之间没有关系,也就是说构造函数返回的对象和构造函数在外部创建的对象没有什么不同。

稳妥构造函数模式,为什么叫做稳妥呢,指的是没有公共的属性,而且其方法也不引用this的对象。稳妥对象最适合在一些安全的环境中使用,这些环境中会禁止使用this和new。它与寄生构造函数遵循类似的模式,但是有两点不同,一是新创建的实例的方法不引用this,二是不使用new操作符调用构造函数。如下例子:


JS--面向对象之寄生构造函数模式和稳妥构造函数模式_第4张图片

可以看到,在这种模式创建的对象中,只可以使用sayName方法,没有其他办法访问name的值,稳妥构造函数的使用方式如下:


这样除了调用sayName()方法,没有别的方式可以访问其数据成员,即使有其他代码给这个对象添加方法或者数据成员,单也不可能有别的方法访问传到构造函数中的原始数据。

关于JS创建对象的这几种模式暂时介绍到这里,以后如果有更深入的学习在和大家一起分享。那么我们会发现在之前创建对象的时候基本上都会使用new操作符,那么new操作符在这里是起到什么作用的呢?

根据JavaScript语言精粹中描述,如果一个函数前面带上new操作符那么将创建一个隐藏连接到该函数prototype成员的新对象,同时this将绑定到那个新对象上。

一般函数在没有返回值得时候,默认会返回undefined,如果使用new操作符,那么返回的将会是一个对象,我们打印出来看看:


JS--面向对象之寄生构造函数模式和稳妥构造函数模式_第5张图片

我们看到创建了一个A函数和一个B函数,A函数通过正常的调用返回了undefined,B函数通过new操作符将返回值赋给了b,将b打印出来会看到是一个对象,那么B函数的prototype默认是一个对象。

如果函数返回出来的是一个new的对象,那么该函数的prototype会根据new出来的对象的prototype而定,这样是不是对之前的工厂函数和寄生构造函数有更深的一步理解了。

你可能感兴趣的:(JS--面向对象之寄生构造函数模式和稳妥构造函数模式)