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 相关文章推荐
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
js去除浏览器默认底图的方法
Jun 08 Javascript
jQuery获取checkboxlist的value值的方法
Sep 27 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
Web前端框架bootstrap实战【第一次接触使用】
Dec 28 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
Jan 11 Javascript
前端axios下载excel文件(二进制)的处理方法
Jul 31 Javascript
React事件处理的机制及原理
Dec 03 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
Jul 28 Javascript
原生js实现购物车功能
Sep 23 Javascript
jQuery实现广告显示和隐藏动画
Jul 04 jQuery
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
php不用正则验证真假身份证
2013/11/06 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
艺术学院毕业生求职信
2014/07/09 职场文书
一般党员对照检查材料
2014/09/24 职场文书
公司股份合作协议书
2014/12/07 职场文书
2014年后备干部工作总结
2014/12/08 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
交通事故调解协议书
2015/05/20 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python