JavaScript 创建对象的模式 (蜜汁上帝视角

这个博客里主要介绍一下JavaScript创建对象的一些模式。想要深入详细了解还是建议大家看看书。


说起创建对象,一般来说我应该讲创建女朋友的。可是想了想我就是女的,也没什么特殊爱好,所以我还是不创建女朋友了。行现在开始:older_man:就是:angel:上帝。:older_man:要开始造人了。

我先造一个亚当,再造一个夏娃。 打印看一下,我已经造成功了。

在这里插入图片描述

他俩生了孩子,叫该隐和亚伯,:older_man:继续造该隐和亚伯,又成功了。

但是你是不是发现问题了,这样就出来了好多重复代码啊。:older_man:要是造60亿人民岂不是累死。所以,我得搞得跟女娲似的,用藤蔓沾了泥土,往地上一甩,泥点点就能成人。所以我开启工厂模式

在这里插入图片描述

工厂模式

工厂模式就是用函数封装,以特定模式创建对象

:older_man:用函数封装了造人对象。

原来造俩人8行代码,现在造俩人8行代码

原来造四人16行代码,现在造四人10行代码。

在这里插入图片描述

只造人不够啊,我还得造动物。有条:snake:引诱了夏娃吃苹果,亚伯该隐还养了:sheep:。我要开始造动物了。

好了现在我已经造成功了,但是问题双来了,虽然我用了三个函数造他们,但是为啥输出出来都是普通object的{}形式?万物平等?:older_man:不同意,万物平等我就都造人了。所以我得把他们区分开。这就用到了构造函数模式

在这里插入图片描述

构造函数模式

构造函数模式就是用构造函数创建特定类型的对象

构造函数形如:


//声明

function 函数名(参数){

	函数体

}

// 使用

let 实例 = new 函数名(参数)

复制代码

然后我就用构造函数的形式来创建了。发现没,还少了声明对象和返回值呢。

但是问题又来了。这就简单了吗?这不是还有大量重复代码?this.name this.gander所有物种都这样搞岂不是累死?那我只好继续简化啦。这就用到了原型模式

在这里插入图片描述

好了,现在让他们叫一声。问题又来了,如果我想让羊也叫,蛇也叫,那岂不是又出现大量一模一样的代码?这个可以用原型模式解决。

在这里插入图片描述

原型模式

我们创建的每一个函数都会有prototype属性,这个属性是一个指针,指向一个对象,这个对象里边包含了各种“由某种特定类型的所有实例”共享的方法和属性。

实例就是 let 实例 = new 函数名() 你声明的这个东西就是实例。这是抽象和具体的概念。你的函数就是抽象,你的实例就是具体。

想了解原型的可以自己看这个JavaScript 详细图解原型

我就不详细解析原型了,我下边直接说方法了。

既然:older_man:想再少写一点代码,那我就直接把这些相同的东西写进原型里。原型链的尽头是Object,我就直接写Object里边吧。

在这里插入图片描述

只要把相同的方法添加到某一个原型中,只要实例在这条原型链上就可以使用这个方法哦。不用每个函数都声明了。

在这里插入图片描述

那你可能问,为什么你不直接把name和gander也放到原型中去。

可以是可以,但是这样代码量并不会减少啊。因为你要给这些属性赋值,你就要再把它拿出来赋值。

你看嘛。不用更改的方法写到原型里,那函数中就不用写了。但是需要更改的方法,你写道原型里,如果你函数体中不给他赋值也没用哦。所以我们才要综合使用构造函数模式和原型模式

在这里插入图片描述

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

这是创建自定义类型最常见的方式。可以将共有的方法和不需要重新赋值的属性写到原型中,而那些特有的属性写到各自的函数体中。

下图中所有生物说的都是‘我是上帝创造的’,这是个不需要改变的属性,因此可以把它加到原型里。

在这里插入图片描述

动态原型模式

检查某个方法是否存在,来决定是否需要初始化原型。

比如现在:older_man:给Person这个函数的原型里添加了speak的方法。

在这里插入图片描述

:older_man:突然又不想当上帝了。让给你吧。

可是你拿到我的代码之后,也想让他们说“我是XXX”,但是你不知道我里边写没写这个方法。那怎么办,那就用到了动态原型模式

猜猜下边的代码待用之后是输出“我是XXX”还是“哈哈哈我是XXX”?

在这里插入图片描述

答案是:在这里插入图片描述

红框框就是动态添加原型,判断函数原型中是否有这个方法再决定要不要添加。因为上边我已经写了Person的speak方法,所以下边判断已经有了,就不会添加这个方法了。

寄生构造函数模式

在这里插入图片描述

这种对比一下工厂模式,你就会发现,其实只多了一个new

稳妥构造函数模式

稳妥构造函数模式创建对象实例方法不引用this,不使用new操作符。

在这里插入图片描述

稳妥对象:是指‘没有公共属性,方法中也不引用this’的对象

稳妥对象最适合在一些安全的环境中或者在防止数据被其他应用程序改动时使用。


今天我也精分成功了

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享