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

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

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

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

Javascript中的继承与复用的更多相关文章

  1. 浅谈JavaScript中的继承

    引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...

  2. 浅谈 JavaScript 中的继承模式

    最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...

  3. javascript中各种继承方式的优缺点

    javascript中实现继承的方式有很多种,一般都是通过原型链和构造函数来实现.下面对各种实现方式进行分析,总结各自的优缺点. 一 原型继承 let Super = functioin(name = ...

  4. 深入理解JavaScript中的继承

    1前言 继承是JavaScript中的重要概念,可以说要学好JavaScript,必须搞清楚JavaScript中的继承.我最开始是通过看视频听培训班的老师讲解的JavaScript中的继承,当时看的 ...

  5. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  6. JavaScript中的继承(原型链)

    一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.pro ...

  7. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  8. 关于JavaScript中实现继承,及prototype属性

    感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...

  9. javascript中实现继承的几种方式

    javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...

随机推荐

  1. JS模拟Touch事件

    var ele = document.getElementsByClassName('target_node_class')[0] //may have x and y properties in s ...

  2. 在arm上执行某个程序时总是提示 not found是怎么回事?

    答: 使用ldd查看程序是否缺少库,如果缺少库,那么就从交叉编译工具链中获取并复制到arm的根文件系统中

  3. PCA人脸识别学习笔记---原理篇

     前言 在PCA人脸识别中我们把一个人脸图片看做一个特征向量,PCA做的事情就是:找到这样一组基向量来表示已有的数据点,不仅仅是将高维度数据变成低维度数据,更能够找到最关键信息. 假设已有数据{xi} ...

  4. 012-Spring Boot web【一】web项目搭建、请求参数、RestController、使用jsp、freemarker,web容器tomcat和jetty

    一.项目搭建 同:http://www.cnblogs.com/bjlhx/p/8324971.html 1)新建maven项目→使用默认配置即可 定义好项目名称等 2)修改jdk版本 <pro ...

  5. centos下使用virtualenv建立python虚拟环境

    在centos使用python3的virtualenv,先用yum install python3 安装后pip3也已经安装好了,pip3 install virtualenv, 在系统中新建一个空文 ...

  6. 《图解 HTTP》读书笔记

    <图解 HTTP>一书是日本学者上野宣所著,2014 年由于均良先生翻译并在国内出版.因为作者使用十分生动的语言和浅显易懂的案例将 HTTP 协议讲解得深入浅出,所以深受开发者喜爱.现在在 ...

  7. 一次Python操作数据库和excel过程

    师从‘百测’besttest 最近牛大湿教了操作数据库和操作excel,写了一个小小的脚本,传入一个表名后,将表中所有数据写入excel中. 使用了pymysql,xlwt,需要自行安装. impor ...

  8. VAO和VBO

    我想大家都已经熟悉VBO了吧.在GL3.0时代的VBO大体还是处于最重要的地位,但是与此同时也出现了不少新的用法和辅助役,其中一个就是VAO.本文大致小记一下这两者的联系,帮助大家理解一下这个角色.— ...

  9. 利用Gabor变换法分析纹理图像 matlab代码实现

    Gabor变化属于加窗傅里叶变换,Gabor函数可以在频域不同尺度.不同方向上提取相关的特征.Gabor函数与人眼的生物作用相仿,所以经常用于纹理识别上,并取得了较好的效果. 二维Gobor滤波函数: ...

  10. Unity学习笔记_控制人物移动+摄像机跟随

    我想做的移动操作方式类似[流星蝴蝶剑].[龙之谷].[我的世界第三人称]的第三人称操作方式. 操作说明:W键会朝当前镜头方向前进,鼠标控制镜头旋转. 做前需知(先去稍微了解一下比较好): ①unity ...