这个思惟导图是我对Object,原型,原型链等知识的总结,主要参考高程一书第六章,写完才发现这么多,之后可能会进行精简。内容可能会出现差错,欢迎批评指正。下载==>Github
ECMAScript支持面向对象(OO)编程,但不使用类或者接口。对象能够在代码执行过程当中建立和加强,所以具备动态性而非严格定义的实体。在没有类的状况下,能够采用下列模式建立对象。git
- 工厂模式,使用简单的函数建立对象,为对象添加属性和方法,而后返回对象。这个模式后来被构造函数模式所取代。
- 构造函数模式,能够建立自定义引用类型,能够像建立内置对象实例同样使用new操做符。不过,构造函数模式也有缺点,即它的每一个成员都没法获得复用,包括函数。因为函数能够不局限于任何对象(即与对象具备松散耦合的特色),所以没有理由不在多个对象间共享函数。
- 原型模式,使用构造函数的prototype属性来指定那些应该共享的属性和方法。组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,而使用原型定义共享的属性和方法。
JavaScript主要经过原型链实现继承。原型链的构建是经过将一个类型的实例赋值给另外一个构造函数的原型实现的。这样,子类型就可以访问超类型的全部属性和方法,这一点与基于类的继承很类似。原型链的问题是对象实例共享全部继承的属性和方法,所以不适宜单独使用。解决这个问题的技术是借用构造函数,即在子类型构造函数的内部调用超类型构造函数。这样就能够作到每一个实例都具备本身的属性,同时还能保证只使用构造函数模式来定义类型。使用最多的继承模式是组合继承,这种模式使用原型链继承共享的属性和方法,而经过借用构造函数继承实例属性。此外,还存在下列可供选择的继承模式。github
- 原型式继承,能够在没必要预先定义构造函数的状况下实现继承,其本质是执行对给定对象的浅复制。而复制获得的副本还能够获得进一步改造。
- 寄生式继承,与原型式继承很是类似,也是基于某个对象或某些信息建立一个对象,而后加强对象,最后返回对象。为了解决组合继承模式因为屡次调用超类型构造函数而致使的低效率问题,能够将这个模式与组合继承一块儿使用。
- 寄生组合式继承,集寄生式继承和组合继承的优势与一身,是实现基于类型继承的最有效方式。
