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 相关文章推荐
jquery 插件 人性化的消息显示
Jan 21 Javascript
javascript 框架小结 个人工作经验
Jun 13 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
利用JS生成博文目录及CSS定制博客
Feb 10 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
AngularJS入门教程之MVC架构实例分析
Nov 01 Javascript
vue中mint-ui的使用方法
Apr 04 Javascript
React如何避免重渲染
Apr 10 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
初级的用php写的采集程序
2007/03/16 PHP
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
详解Django通用视图中的函数包装
2015/07/21 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python3计算三角形的面积代码
2017/12/18 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
职位说明书范文
2014/05/07 职场文书
经典团队口号
2014/06/06 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
Python实现简单的俄罗斯方块游戏
2021/09/25 Python