JavaScript之面向对象--JavaScript学习笔记

148 阅读2分钟

JavaScript之面向对象

1. 对象创建的六种方式

1.1 工厂模式

原理:用函数来封装创建对象的细节,通过调用函数来达到复用的目的。

缺点:创建出来的对象无法和某个类型联系起来,而没有建立起对象和类型间的关系。

1.2 构造函数模式

只要一个函数是通过 new 来调用的,那么就可以把它称为构造函数。

new 执行构造函数分四步:

  • 首先会创建一个对象
  • 然后将对象的原型指向构造函数的 prototype
  • 然后将执行上下文中的 this 指向这个对象
  • 最后再执行整个函数,如果返回值不是对象,则返回新建的对象。

因为 this 的值指向了新建的对象,因此可以使用 this 给对象赋值。

优点: 可以通过原型来识别对象的类型。

缺点: 造成了不必要的函数对象的创建,如果对象属性中如果包含函数的话,那么每次都会新建一个函数对象,浪费了不必要的内存空间,因为函数是所有的实例都可以通用的。

1.3 原型模式

原理:每一个函数都有一个 prototype 属性,这个属性是一个对象, 它包含了通过构造函数创建的所有实例都能共享的属性和方法。因此可以使用原型对象来添加公用属性和方法,从而实现代码的复用。

缺点

  • 一个是没有办法通过传入参数来初始化值
  • 另一个是如果存在一个引用类型如 Array 这样的值,那么所有的实例将共享一个对象。

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

解决了两种模式单独使用时的缺点,但是有一点不足的就是,因为使用了两种不同的模式,所以对于代码的封装性不够好。

1.5 动态原型模式

原理:将原型方法赋值的创建过程移动到了构造函数的内部,通过对属性是否存在的判断,可以实现仅在第一次调用函数时对原型对象赋值一次的效果。

1.6 寄生构造函数模式

原理:和工厂模式的实现基本相同,主要是基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函数,也达到了扩展对象的目的。

缺点:和工厂模式一样,无法实现对象的识别。

2. 对象继承的六种方式

2.1 以原型链的方式来实现继承

2.2 使用借用构造函数的方式

2.3 组合继承

2.4 原型式继承

2.5 寄生式继承

2.6 寄生式组合继承

参考:面向对象