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 相关文章推荐
获取HTML DOM节点元素的方法的总结
Aug 21 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
Apr 09 Javascript
javascript强制点击广告的方法
Feb 06 Javascript
Javascript writable特性介绍
Feb 27 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 Javascript
js实现文字无缝向上滚动
Feb 16 Javascript
Node接收电子邮件的实例代码
Jul 21 Javascript
vue结合Echarts实现点击高亮效果的示例
Mar 17 Javascript
React Native基础入门之调试React Native应用的一小步
Jul 02 Javascript
vue动画打包后失效问题的解决方法
Sep 18 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
Jul 14 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
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
javascript 动态添加表格行
2006/06/22 Javascript
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
js同时按下两个方向键
2007/12/01 Javascript
网页自动跳转代码收集
2009/09/27 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
webpack打包node.js后端项目的方法
2018/03/10 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
效能监察建议书
2014/05/19 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
工商行政处罚决定书
2015/06/24 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书