JavaScript mixin实现多继承的方法详解


Posted in Javascript onMarch 30, 2017

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

mixin简单通俗的讲就是把一个对象的方法和属性拷贝到另一个对象上,注意这个继承还是有区别的。js是一种只支持单继承的语言,毕竟一个对象只有一个原型,如果想实现多继承,那就简单暴力的把需要继承的父类的所有属性都拷贝到子类上,就是使用mixin啦。

下面所有代码可以到github上查看完整版。

一个简单的mixin

直接上代码

function extend(destClass, srcClass) {
  var destProto = destClass.prototype;
  var srcProto = srcClass.prototype;
  for (var method in srcProto) {
    if (!destProto[method]) {
      destProto[method] = srcProto[method];
    }
  }
}
function Book(){}
Book.prototype.printName = function(){
  console.log('I am a book, named hello');
};
function JS(){}
extend(JS, Book);
var js = new JS();
console.log(js);

JavaScript mixin实现多继承的方法详解

现在你应该大概了解mixin在做什么。

可以仅仅拷贝某些方法:

function extend(destClass, srcClass, methods) {
  var srcProto = srcClass.prototype;
  var destProto = destClass.prototype ;  
  for (var i=0; i<methods.length; i++) {
    var method = methods[i];
    if (!destProto[method]) {
      destProto[method] = srcProto[method];
    }
  }
}
function Book() {}
Book.prototype.getName = function() {};
Book.prototype.setName = function() {};
function JS() {}
extend(JS, Book, ['getName']);
var js = new JS();
console.log(js);

JavaScript mixin实现多继承的方法详解

mixin实现多继承

直接上代码。

function extend(destClass) {
  var classes = Array.prototype.slice.call(arguments, 1);
  for (var i=0; i<classes.length; i++) {
    var srcClass = classes[i];
    var srcProto = srcClass.prototype;
    var destProto = destClass.prototype; 
    for (var method in srcProto) {
      if (!destProto[method]) {
        destProto[method] = srcProto[method];
      }
    }
  }
}
function Book() {}
Book.prototype.getName = function() {};
Book.prototype.setName = function() {};
function Tech(){}
Tech.prototype.showTech = function(){};
function JS() {}
extend(JS, Book, Tech);
var js = new JS();
console.log(js);

JavaScript mixin实现多继承的方法详解

总结

很多前端库里都有mixin方法,只是叫法不一样,比如 jQuery的extend ,文中我们实现的都是浅拷贝,jQuery中的extend可以实现深拷贝。很多库会使用mixin的方式,将一些工具方法扩展到相应对象中,实现代码复用。

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

Javascript 相关文章推荐
表单(FORM)的一些实用效果代码
Mar 25 Javascript
js有关元素内容操作小结
Dec 20 Javascript
javascript实现图片切换的幻灯片效果源代码
Dec 12 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
JavaScript利用Date实现简单的倒计时实例
Jan 12 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
Jun 12 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
微信小程序radio组件使用详解
Jan 31 Javascript
Vue js 的生命周期(看了就懂)(推荐)
Mar 29 Javascript
详解服务端预渲染之Nuxt(介绍篇)
Apr 07 Javascript
解决vue跨域axios异步通信问题
Apr 17 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 #Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 #jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 #jQuery
借助node实战JSONP跨域实例
Mar 30 #Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 #Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 #Javascript
实例详解display:none与visible:hidden的区别
Mar 30 #Javascript
You might like
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python打开网页和暂停实例
2014/09/30 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python机器学习实战之树回归详解
2017/12/20 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
法人代表资格证明书
2015/06/18 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
学困生转化工作总结
2015/08/13 职场文书
小学中队委竞选稿
2015/11/20 职场文书