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

发布时间 - 2026-01-11 00:26:49    点击率:

本文实例讲述了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);

现在你应该大概了解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);

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);

总结

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

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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


# JavaScript  # mixin  # 多继承  # 用JavaScript实现单继承和多继承的简单方法  # ExtJS4中使用mixins实现多继承示例  # js中继承的几种用法总结(apply  # call  # prototype)  # 实现JavaScript中继承的三种方式  # JS继承--原型链继承和类式继承  # Javascript基于对象三大特性(封装性、继承性、多态性)  # Javascript 继承机制的实现  # 再谈javascript原型继承  # JavaScript继承与多继承实例分析  # 都是  # 都有  # 是一种  # 相关内容  # 是有  # 那就  # 子类  # 做什么  # 遍历  # 感兴趣  # 数据结构  # 给大家  # 拷贝到  # 只有一个  # 你应该  # 可以实现  # 更多关于  # 所述  # 程序设计  # 面向对象 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  如何获取免费开源的自助建站系统源码?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  想要更高端的建设网站,这些原则一定要坚持!  如何在建站之星网店版论坛获取技术支持?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  如何快速启动建站代理加盟业务?  如何在服务器上配置二级域名建站?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何确保FTP站点访问权限与数据传输安全?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  怎样使用JSON进行数据交换_它有什么限制  Laravel如何使用查询构建器?(Query Builder高级用法)  如何在IIS中新建站点并解决端口绑定冲突?  如何快速搭建安全的FTP站点?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何登录建站主机?访问步骤全解析  如何快速查询域名建站关键信息?  如何快速搭建高效WAP手机网站吸引移动用户?  公司门户网站制作流程,华为官网怎么做?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  SQL查询语句优化的实用方法总结  黑客如何通过漏洞一步步攻陷网站服务器?  原生JS获取元素集合的子元素宽度实例  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何在橙子建站上传落地页?操作指南详解  千库网官网入口推荐 千库网设计创意平台入口  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  如何在IIS7上新建站点并设置安全权限?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  北京的网站制作公司有哪些,哪个视频网站最好?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何快速配置高效服务器建站软件?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Android GridView 滑动条设置一直显示状态(推荐)  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何为不同团队 ID 动态生成多个独立按钮  实例解析Array和String方法