在前端开发过程中,对于初次接触的小白来说,js的面向对象是一个头疼的问题,不易理解,许多小伙伴看完文档之后一脸茫然。本篇文章将带领大家拨开迷雾,深入浅出理解js的面向对象。
·面向对象
· 首先,我们要明确,面向对象不是语法,是一个思想,是一种编程模式
·面向:面(脸),向(朝着)
·面向过程:脸朝着过程=》关注着过程的编程模式
· 面向对象:脸朝着对象=》关注着对象的编程模式
·实现一个效果
。在面向过程的时候,我们要关注每一个元素,每一个元素之间的关系,顺序.......
。在面向过程的时候,我们要关注的就是找到一个对象来帮我做这个事情,我等待结果
·我们以前的编程思想是,每一个功能,都按照需求一步一步的逐步完成
创建对象的方式
·因为面向对象就是一个找到对象的过程
·所以我们先要了解如何创建一个对象
调用系统内置的构造函数创建对象
· js给我们内置了一个Object构造函数
·这个构造函数就是用来创造对象的
面向对象开发中,我们需要对方法封装,或者对方法进行隔离,要将数据和处理的方法放在自己的内部中 ,说到这里可能会有小伙伴说了,我们会操作呀,通过字面量方式创建
但是我们需要的批量 创建的问题。
接下来我们使用通俗易懂的语言进行描述讲解。
假设我们开了一个饭店,我们创建的一个对象看做为一道菜,如果我们按照字面量的方式创建对象,那么这个饭店永远只能制作固定的一道菜,用代码表示如下图所示:
此时如果饭店还要新增其他菜品,那么又要继续通过字面量方式进行创建新的对象 ,如果该饭店要制作100道菜则需要创建100个新对象。实际开发中,这样做不仅不理由代码维护,还严重浪费内存空间。
上面的案例,不叫面向对象开发,只是将字面量创建方式写了多遍而已。
那接下里又有小伙伴该说了,我们可以通过内置构造函数进行创建对象。
这里复习一下内置的构造函数
内置的构造函数就是new关键字,常用的内置构造函数分别为new Object(); new String(); new Array()
上面的new的方式写完之后,不属于面向对象。 但是可以创建对象,我们创建一个对象,通过对象点属性的方式。代码如下所示:
如果这个时候,再有一道菜,就需要再次创建一个对象,继续对象点属性方式。
上面的创建对象的方式,我们发现完全没有基于“工厂模式”每一次都要创建一个全新的对象,再往每个对象上挂属性,之前写过的一些方法也没法复用。这种创建对象的方式也不符合我们面向对象创建对象的模式。
前面的通过字面量创建对象也可以称为面向对象,它可以解决单个的问题,但是无法解决一系列多个的问题,我们的要求是能够解决一系列的(工厂模式)。
工厂函数
为了能解决一系列的而非单个的问题,此时就需要面向对象的思想,代码如下所示:
如果此时有客人说要吃蒸羊羔,那么我们直接调用createObj()即可。
打印结果为一个函数内部返回一个对象
代码优化,可以使用参数传递的效果
工厂模式大大的省略了代码量,可是还有没有更好的方法呢?
自定义构造函数
自定义构造函数是我们js中做面向对象的一种开发方式
在上述代码上,我们封装的函数中,将属性挂到this中即可,当调用封装的函数的时候,加入关键字new,就相当于返回了一个新对象,不用像前面的代码那样,在工厂模式下,先创建一个对象,将属性挂载到创建的对象中,最后返回一个对象。
总结:上面的案例,是通过自定义构造函数引入面向对象,自定义构造函数我们创建后,如果普通调用,那就是一个普通执行函数,但是如果你调用这个函数后,在前面加了一个new,这个函数则立马变成了一个新的构造函数 ,new完之后,在自定义的函数内部自动的创建了一个对象,而且在内部自动返回了一个对象。
下篇文章,我们将解释这个构造函数需要注意的地方,以及构造函数中this的指向问题。 详情参考下篇文章《构造函数注意的问题》