js里是否有多继承,如何实现多继承。在这里可以看看java是如何处理多继承的问题,java里是没有多继承的,即一个子类不能同时继承多个父类,但可以实现多个接口,这也间接的实现了多继承。主要是因为多继承涉及到成员变量重名的问题,对于java这种强类型语言,是很不好操作的。所以java让接口成的成员变量只能定义为常量。这也解决了实现多个接口的问题。

对于js来说,如何实现一个子类继承多个父类呢?怎样让父类的特权属性和共有方法实现比较完美的继承呢?参考上一篇中的两种继承方式。会发现多继承是不能用空函数来实现的,下面具体说明如何操作。

function Parent1(name,age){this.name = name;this.age = age;this.height=180;
}
Parent1.prototype.say = function(){alert('hi...');
}
function Parent2(name,age,weight){this.name = name;this.age = age;this.weight = weight;this.height = 170;this.skin='yellow';
}
Parent2.prototype.walk = function(){alert('walk...');
}function Child(name,age,weight){Parent1.call(this,name,age);Parent2.call(this,name,age,weight);
}for(var i in Parent1.prototype){Child.prototype[i] = Parent1.prototype[i]}
for(var i in Parent2.prototype){Child.prototype[i] = Parent2.prototype[i]}var c1 = new Child('xiaoming',10,8);
console.log(c1); //Child { name="xiaoming", age=10, height=170, 更多...}

console.log(c1.constructor);//Child(name,age,weight)

可以看到子类Child的实例c1打出的结果继承了父类的所有属性和方法。当然这里存在一个问题,如果父类Parent1和Parent2都有name这个属性的时候,会以后继承的为主。即这里c1的name属性为170,覆盖了Parent1的属性180。

可以理解javascript的多继承其实就是前面介绍的js循环拷贝继承的多次使用。下面来讲讲为什么空函数继承的方法是不行的。同样举例说明:

二、用空函数实现多继承(此方法不行)

function Parent1(name,age){this.name = name;this.age = age;this.height=180;
}
Parent1.prototype.say = function(){alert('hi...');
}
function Parent2(name,age,weight){this.name = name;this.age = age;this.weight = weight;this.height = 170;this.skin='yellow';
}
Parent2.prototype.walk = function(){alert('walk...');
}function Child(name,age,weight){Parent1.call(this,name,age);Parent2.call(this,name,age,weight);
}
function Empty1(){}
Empty1.prototype = Parent1.prototype;//将Parent1的prototype赋给Empty1的prototype
Child.prototype = new Empty1(); //将Empty1的实例赋给Child的prototype//同样对于Parent2也使用这种方法时
function Empty2(){}
Empty2.prototype = Parent2.prototype;
Child.prototype = new Empty2(); //这里Child的prototype已经有了Parent1的共有方法,这里将Parent2的方法赋过来,是覆盖
Child.prototype.constructor = Child;var c1 = new Child('xiaoming',10,8);
console.log(c1.constructor);//Child(name,age,weight)
console.log(c1); //Child { name="xiaoming", age=10, height=170, 更多...}

可以看到子类的实例只有walk方法,而Parent1的say方法被覆盖了。

总结:javascript是可以利用call方法和prototype属性来实现多继承的。继承方法与单继承相似,只是将需要继承的多个父类依次实现,另外对于属性或共有方法重命的时候,以最后继承的属性和方法为主。因为会覆盖前面的继承。

转载自:https://www.cnblogs.com/lj915/p/3784138.html

转载于:https://www.cnblogs.com/foreverlin/p/10096764.html

JavaScript多继承(转载)相关推荐

  1. 深入解析JavaScript 原型继承

    JavaScript 原型继承,学习js面向对象的朋友可以看看.十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Object.prototype Ja ...

  2. JavaScript实现继承的方式和各自的优缺点

    ECMAscript只支持实现继承,主要是依靠原型链来实现的. JavaScript实现继承的方式: 类式继承 构造函数继承 组合继承 寄生组合式继承 1.类式继承 1 //类式继承 2 //声明父类 ...

  3. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

  4. JavaScript 的继承与多态

    es6之前,javascript本质上不能算是一门面向对象的编程语言,因为它对于封装.继承.多态这些面向对象语言的特点并没有在语言层面上提供原生的支持.但是,它引入了原型(prototype)的概念, ...

  5. JavaScript实现继承的方式,不正确的是:

    JavaScript实现继承的方式,不正确的是:DA.原型链继承 B.构造函数继承 C.组合继承 D.关联继承 解析 javaScript实现继承共6种方式: 原型链继承.借用构造函数继承.组合继承. ...

  6. JavaScript 实现继承的5种方式

    js是一个面向对象的语言,所以具备一些面向对象的方式----------例如继承.接下来介绍5种js的继承方式.注意:js 中的函数其实是对象,函数名是对 Function 对象的引用. 1.采用ca ...

  7. 白话解释 Javascript 原型继承(prototype inheritance)

    来源: 个人博客 白话解释 Javascript 原型继承(prototype inheritance) 什么是继承? 学过"面向对象"的同学们是否还记得,老师整天挂在嘴边的面向对 ...

  8. JavaScript面向对象--继承 (超简单易懂,小白专属)...

    JavaScript面向对象--继承 (超简单易懂,小白专属) 一.继承的概念 子类共享父类的数据和方法的行为,就叫继承. 二.E55如何实现继承?探索JavaScript继承的本质 2.1构造函数之 ...

  9. JavaScript实现继承的方式

    这篇文章主要介绍JavaScript实现继承的方式: 类式继承 构造函数继承 组合继承 寄生组合式继承 extends继承 1.类式继承 简单的类式继承: // 声明父类function Animal ...

  10. jQuery-源码阅读,JavaScript原生继承方式与jQuery中的继承

    JavaScript中继承方法有以下几种: 1.原型链继承: function Book (name,author){this.name=name;this.author=author;}Book.p ...

最新文章

  1. HA: SHERLOCK 靶机渗透取证
  2. ethercard php_使用Arduino和ENC28J60以太网LAN网络模块发送HTTP POST请求
  3. 网络模型和TCP协议族
  4. vue 懒人_Vue.js 中的实用工具方法【推荐】
  5. Redis数据类型--列表类型
  6. java main传入参数_Main方法中传入参数
  7. c++提取map key_写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?...
  8. Android飞机大战游戏报告,基于android的飞机大战游戏设计与开发.doc
  9. C语言:二进制转换十进制
  10. 魔兽按键精灵 V2.0(修正1)
  11. win10 office提示‘VBE6EXT.OLB不能被加载‘怎么办
  12. 新手做头条号短视频,这三大点要牢记,让你少走弯路,抓紧收藏
  13. 渗透测试的8个步骤—转载
  14. python安装dlib(已成功并且无出现报错AttributeError: module ‘dlib‘ has no attribute ‘get_frontal_face_detecetor
  15. 单片机课程设计温控风扇(源代码+Proteus仿真图)
  16. 常用软件的历史版本资源下载汇总(持续更新)
  17. 项目5 子域的加入、域的删除
  18. hyperf接入阿里云nacos配置中心
  19. 1.2基本IO口控制
  20. Repository

热门文章

  1. jmeter html测试脚本,Jenkins如何实现自动运行jmeter脚本并出具报告
  2. micropython 驱动oled0.91_[MicroPython]STM32F407开发板驱动OLED液晶屏
  3. python平稳性检验_Python中非平稳时间序列的处理
  4. ih5怎么切换下一个页面_区块链是下一个风口?那PPT该怎么做?
  5. 前端面试你必须要注意的哪几个点?
  6. 大佬教你如何写出更好的CSS,分享web前端资料
  7. power bi 日期计算_2020国内外常用的BI商业智能软件
  8. php 正则xml文件,php 读取xml的方法三---用php正则表达式来记取数据
  9. Java教程:Java break语句:跳出循环
  10. 西门子for循环例子_理解JavaScript中的循环缺陷和迭代协议