我们知道JavaScript是面向对象的脚本语言,那么既然是面向对象,继承一定是必不可少的了。JavaScript的核心是ECMAScript,JavaScript继承机制的实现其实就是ECMAScript继承机制的实现。

继承的方式

ECMAScript 实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。最原始的继承实现方式就是对象冒充,下面着重介绍该方法。

对象冒充

对象冒充实现继承的核心其实依赖于在函数环境中使用 this 关键字。其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使 ClassA 构造函数成为 ClassB 的方法,然后调用它。ClassB 就会收到 ClassA 的构造函数中定义的属性和方法。例如,用下面的方式定义 ClassA 和 ClassB:

function ClassA(sColor) {this.color = sColor;this.sayColor = function () {alert(this.color);};
}function ClassB(sColor) {
}

关键字 this 引用的是构造函数当前创建的对象。不过在这个方法中,this 指向的所属的对象。这个原理是把 ClassA 作为常规函数来建立继承机制,而不是作为构造函数。如下使用构造函数 ClassB 可以实现继承机制:

function ClassB(sColor) {this.newMethod = ClassA;this.newMethod(sColor);delete this.newMethod;
}

在这段代码中,为 ClassA 赋予了方法 newMethod(请记住,函数名只是指向它的指针)。然后调用该方法,传递给它的是 ClassB 构造函数的参数 sColor。最后一行代码删除了对 ClassA 的引用,这样以后就不能再调用它。

所有新属性和新方法都必须在删除了新方法的代码行后定义。否则,可能会覆盖超类的相关属性和方法:

function ClassB(sColor, sName) {this.newMethod = ClassA;this.newMethod(sColor);delete this.newMethod;this.name = sName;this.sayName = function () {alert(this.name);};
}

为证明前面的代码有效,可以运行下面的例子:

var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();    //输出 "blue"
objB.sayColor();    //输出 "red"
objB.sayName();        //输出 "John"

对象冒充可以实现多重继承

有趣的是,对象冒充可以支持多重继承。例如,如果存在两个类 ClassX 和 ClassY,ClassZ 想继承这两个类,可以使用下面的代码:

function ClassZ() {this.newMethod = ClassX;this.newMethod();delete this.newMethod;this.newMethod = ClassY;this.newMethod();delete this.newMethod;
}

这里存在一个弊端,如果存在两个类 ClassX 和 ClassY 具有同名的属性或方法,ClassY 具有高优先级。因为它从后面的类继承。除这点小问题之外,用对象冒充实现多重继承机制轻而易举。

由于这种继承方法的流行,ECMAScript 的第三版为 Function 对象加入了两个方法,即 call() 和 apply()。后来很多衍生出来的实现继承的方法其实也是基于call() 和 apply()来实现的。

转载于:https://www.cnblogs.com/CodeGuy/archive/2013/05/03/3056718.html

JavaScript实现继承机制(1)—— 构造函数方法对象冒充相关推荐

  1. JavaScript实现继承机制(3)——通过原型链(prototype chaining)方式

    我们知道在JavaScript中定义类的原型方式,而原型链扩展了这种方式,以一种有趣的方式实现继承机制. prototype 对象是个模板,要实例化的对象都以这个模板为基础.总而言之,prototyp ...

  2. JavaScript之继承模式,命名空间,对象枚举

    继承发展史 1-传统形式 → 原型链 过多的继承了没用的属性(很好理解,不用代码演示了) 2-借用构造函数 不能继承借用构造函数的原型(很好理解,不用代码演示了) 每次构造函数都要夺走一个函数(很好理 ...

  3. JavaScript大杂烩4 - 理解JavaScript对象的继承机制

    JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...

  4. js继承java方法吗_你知道JavaScript的继承吗?

    导读: 在ES6 之前js中是并没有extends继承,就像是java的单继承继承,我们通过多实现的方法模拟java的多继承,所以我们也可以同通过,利用构造函数和原型对象实现来实现JavaScript ...

  5. Python继承机制及其使用

    Python继承机制及其使用 Python 类的封装.继承.多态 3 大特性,前面章节已经详细介绍了 Python 类的封装,本节继续讲解 Python 类的继承机制. 继承机制经常用于创建和现有类功 ...

  6. javascript 对象基础 继承机制实例【对象冒充】

    面向对象语言 必须支持继承机制,既一个类能重用另一个类的方法和属性. 1.继承方式 对象冒充 工作原理:构造函数使用this关键字,给所有属性和方法赋值,因为构造函数值只是一个函数,所以可以使Clas ...

  7. JavaScript进阶-编程思想、构造函数的原型对象、对象原型、原型继承以及原型链

    编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次 调用就可以了. 优点: 性能比面向对象高,适合跟硬件联系很紧密 的东西,例如单 ...

  8. javascript面向对象系列第一篇——构造函数和原型对象

    前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是 ...

  9. 深入浅出理解Javascript原型概念以及继承机制(转)

    在Javascript语言中,原型是一个经常被讨论到但是有非常让初学者不解的概念.那么,到底该怎么去给原型定义呢?不急,在了解是什么之前,我们不妨先来看下为什么. Javascript最开始是网景公司 ...

  10. Javascript继承机制的设计思想

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

最新文章

  1. OpenGL坐标系及坐标转换
  2. java web 总结,Java Web 相关概念经典总结(一)
  3. intellij idea 1314 插件推荐及快速上手建议
  4. 数字旅游解决方案_迪庆州首个数字旅游小镇5G基站在巴拉格宗开通
  5. lepus监控oracle数据库_MySQL数据库监控软件lepus使用问题以及解决办法
  6. Elasticsearch启动报错:Exception in thread “main“ java.nio.file.AccessDeniedException:
  7. python中读取文本文件_利用Python读取文本文件?
  8. 液晶面板里面有些什么配件_液晶电视核心部件液晶面板有哪些类型?
  9. LINUX不能恢复式安装
  10. paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
  11. 使用VS Code插件Code Runner一键运行ANSYS命令流
  12. 智能开关的零火版和单火版有什么区别
  13. DUXCMS 2.x学习问题(一)
  14. Discuz大气游戏风格模板/仿lol英雄联盟游戏DZ游戏模板GBK
  15. 织梦dedecms会员设置、互动设置教程
  16. openwrt之mwan3负载均衡·多线多拨
  17. 如何成为一个很厉害的人(时间之尺)
  18. this java 错误_java异常错误处理
  19. 网站实现qq登录(springboot后台)
  20. OPENCV2.4.9配置

热门文章

  1. 怎么扒站建站_个人怎么做独立站Shopify商店!Shopify建站教程详解!(实操干货)...
  2. 解决g2o无法编译出g2o_viewer的问题
  3. linux有名管道 复用,Linux进程间通信(九)---综合实验之有名管道通信实验
  4. 文件分片_文件分片上传原理解析
  5. Python:内置类型
  6. io vivado 怎么查看ps_一次诡异的磁盘IO使用率高排查
  7. 用tensorflow实现矩阵分解
  8. matplotlib绘制横向柱状图
  9. 刚才读《基于Lucene的中文自然语言搜索引擎》后感
  10. MapReduce如何使用多路输出