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 相关文章推荐
JAVASCRIPT下判断IE与FF的比较简单的方式
Oct 17 Javascript
jQuery操作input值的各种方法总结
Nov 21 Javascript
JS实现往下不断流动网页背景的方法
Feb 27 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
Jul 03 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
JavaScript验证知识整理
Mar 24 Javascript
详解JS中遍历语法的比较
Apr 07 Javascript
ReactJS实现表单的单选多选和反选的示例
Oct 13 Javascript
vue的mixins属性详解
Mar 14 Javascript
VUE+node(express)实现前后端分离
Oct 13 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
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
Js四则运算函数代码
2012/07/21 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
Django的数据模型访问多对多键值的方法
2015/07/21 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
vscode 远程调试python的方法
2017/12/01 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python3 max()函数基础用法
2019/02/19 Python
python验证身份证信息实例代码
2019/05/06 Python
Python发展史及网络爬虫
2019/06/19 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
大学生简历中个人的自我评价
2013/10/06 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
疾病捐款倡议书
2014/05/13 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
学习三严三实心得体会
2014/10/13 职场文书
开除员工通知
2015/04/22 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
mysql创建存储过程及函数详解
2021/12/04 MySQL