JavaScript实现多重继承的方法分析


Posted in Javascript onJanuary 09, 2018

本文实例讲述了JavaScript实现多重继承的方法。分享给大家供大家参考,具体如下:

1. 定义一个空的父类构造函数,然后通过prototype的方式为该父类定义属性和方法

2. 定义一个空的子类的构造函数,然后将子类的原型绑定在父类的实例上,再将子类原型的父类也绑定在父类的实例上。通过prototype的方式为子类设置自己的属性和方法。

3. 定义一个空的孙类构造函数,然后将孙类的原型绑定到子类的实例上,再将孙类原型的父类绑定到子类的实例上。通过prototype方式为孙类定义自己的属性和方法。

4. 实例化一个孙类对象,通过调用该实例对象,调用自身的方法,也可以调用孙类的父类即文中的子类的方法,也可直接调用最大父类即这里父类的方法,也可以为当前对象添加属性和方法。

function Person(){}
Person.prototype.name = "人";// 为人类创建一个name属性
Person.prototype.say = function(content){// 为人类创建一个说话的方法
  if(!this.name){ // 如果对象不存在name属性,则使用原型链的name
    this.name = this.__proto__.name;
  }
  console.log("我是" + this.name + ",我想说"+content);
};
function Parent(){}
Parent.prototype = new Person();  // 设置Parent类继承Person类
Parent.prototype.superClass = new Person();// 设置superClass保存父类Person的方法属性
Parent.prototype.name = "父辈类";// 设置Parent类的name属性
Parent.prototype.say = function(){// 设置Parent类自己的 say 方法
  console.log("我是Parent类的say方法!");
};
function Child(){}
Child.prototype = new Parent();// 设置Child类继承Parent类
Child.prototype.superClass = new Parent();// 设置superClass保存父类Parent的方法属性
Child.prototype.say = function(){  //设置Child类自己的say方法
  console.log("我是Child类的say方法!");
}
var c = new Child();// 实例化一个Child对象
c.say();  // 调用自身原型的say方法,输出:我是Child类的say方法!
c.superClass.say(); // 调用父类Parent的say方法,输出: 我是Parent类的say方法!
c.superClass.superClass.say("哈哈");// 直接调用最大的父类Person的say方法(方法中的this指向Person),输出:我是人,我想说哈哈"
// 用call调用最大的父类Person的say方法(方法中的this指向实例化对象c,但此时c并没有name属性,所以this.name用的是Parent的name)
c.superClass.superClass.say.call(c,"嘻嘻"); // 输出:我是父辈类,我想说嘻嘻
c.name = "子类实例";// 给当前对象增加name属性
// 还是用call调用最大父类Person的say方法(此时c对象中已经有name属性);
c.superClass.superClass.say.call(c,"我是子类的实例化对象"); // 输出:我是子类实例,我想说我是子类的实例化对象

ps:多重继承可以在原型对象上新增一个属性用以保存父类的对象和属性,子类调用的时候使用superClass点出父类方法,这样一来就解决了父类和子类方法同名,子类继承父类之后会覆盖父类方法的问题。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
关闭页面时window.location事件未执行的原因分析及解决方案
Sep 01 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
js精准的倒计时函数分享
Jun 29 Javascript
轻松5句话解决JavaScript的作用域
Jul 15 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
vue2.0 实现富文本编辑器功能
May 26 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
webpack多入口文件页面打包配置详解
Jan 09 #Javascript
Vue项目组件化工程开发实践方案
Jan 09 #Javascript
详解webpack之scss和postcss-loader的配置
Jan 09 #Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
Jan 09 #Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
Jan 09 #Javascript
详解webpack babel的配置
Jan 09 #Javascript
webpack+vue2构建vue项目骨架的方法
Jan 09 #Javascript
You might like
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python实现批量图片格式转换
2020/06/16 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
祖国在我心中演讲稿
2014/01/15 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
化妆品促销方案
2014/02/24 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
三好学生评语大全
2014/12/29 职场文书
环境建议书
2015/02/04 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
如何使用python包中的sched事件调度器
2022/04/30 Python