实现代码复用的方法包括:工厂模式、构造函数模式、原型模式(《高三》6.2章 P144),它们各自的特点归结如下:
1、工厂模式虽然使创建对象一定程度上实现了代码复用,但却没有解决对象识别问题,即类型判断。而构造函数模式可以解决这一问题。
2、构造函数模式在类型判断上比工厂模式有优势,而且也一定程度上实现了代码复用,但它的问题就在于实例成员(属性和方法)都定义在了构造函数中,
属性还好,但是方法被定义在构造函数中就有问题了,因为我们知道在ECMAScript中,一切函数皆对象,因此每次new新对象时,方法也就实例化了一个对象,
这样就会占用更多的内存空间,影响了代码性能。幸好有了原型模式,这样的重复实例化对象的问题可以解决。
3、原型模式就优势在于可将成员定义在构造函数的原型中实现共享,而不必在构造函数中定义对象实例的信息了。这一模式实现了对象成员最本质的共享,
从而避免了上面说的占用过多内存导致性能下降的问题。但是它同样会有缺点,那就是如果在原型中定义了引用类型会导致意外的结果(详见《高三》P158)。

综上所述,通常为了实现代码最大程度上的复用,采用构造函数模式与原型模式共存的解决方案,发挥各自的优势,互补各自的缺陷。
构造函数模式用于定义实例属性,包括上述的引用类型的成员;而原型模式用于定义方法和共享的属性,结果,每个实例都会有自己的一份实例属性的副本,
但同时又共享着对方法的引用,最大程度的节省了内存,提高了代码效率。

实现继承:
利用原型链的特性和借用构造函数(call、apply)均能实现继承,二者都各有优势和不足。(《高三》P167)
原型链虽然强大,但存在一些问题,最主要的问题来自包含引用类型值得原型;其次是在创建子类型实例时,不能向超类型的构造函数中传递参数。
而在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数的技术,这种技术的基本思想相当简单,---即在子类构造函数的内部
调用超类构造函数。同时,相对于原型而言,借用构造函数有还有一个很大的优势,它可以在子类构造函数中向超类型构造函数传递参数。
但是,借用构造函数无法避免构造函数模式存在的问题,---即方法都在构造函数中定义,函数复用就无从谈起了。

综上所述,为了完美地实现继承,通常采用的是以上两种继承方式共存的解决方案,---即组合继承!
组合继承指的是将原型链和借用构造函数的技术组合到一起,从而发挥二者之长的一种继承模式,其背后的思路就是使用原型链实现对原型属性和方法的继承;
而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能保证每个实例都有它自己的属性。
组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为了Javascript中最常用的继承模式。
而且,instanceof和isprototypeOf()也能够识别基于组合继承创建的对象,即组合继承创建的对象支持对象类型的判断。

最新文章

  1. PySe-004-Se-WebDriver 启动浏览器之二 - Chrome
  2. GitHub Desktop for Win 安装不上
  3. POJ 1401
  4. JS 公共方法
  5. 【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
  6. emWin使用外部SRAM的方法
  7. C#根据日期DateTime和持续时间int找到日期
  8. 樱花雨 www.yinghy.com
  9. 图文讲解基于centos虚拟机的Hadoop集群安装,并且使用Mahout实现贝叶斯分类实例 (7)
  10. openfire研究之部署连接管理器(connection manager)
  11. java设计模式之——策略模式
  12. DB2使用存储过程插入数据
  13. Linux下的数据监控工具
  14. C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化
  15. 学习Python3 天眼查 爬虫
  16. Reactor
  17. 第34章:MongoDB-索引--用户管理
  18. opencv-原图基础上添加指定颜色
  19. [UE4]C++方法多个返回值给蓝图
  20. 续写上一篇的数组or指针操作

热门文章

  1. ios TCP抓包
  2. vue+webpack 实现懒加载的三种方式
  3. linux高可用集群(HA)原理详解
  4. React开发环境配置
  5. 一百三十:CMS系统之七牛js和python的SDK使用示例
  6. Scrapy框架(1)
  7. Django:(07)数据库
  8. 最新 科大讯飞java校招面经 (含整理过的面试题大全)
  9. js模板(template.js)实现页面动态渲染
  10. 解决SpringMVC拦截静态资源的问题