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 设计模式学习 Factory
Jul 29 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
Aug 21 Javascript
利用CSS3在Angular中实现动画
Jan 15 Javascript
概述VUE2.0不可忽视的很多变化
Sep 25 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 Javascript
原生js实现手风琴功能(支持横纵向调用)
Jan 13 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
vue项目中跳转到外部链接的实例讲解
Sep 20 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 Javascript
jQuery实现简单弹幕效果
Nov 28 jQuery
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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生成HTML静态页面实例代码
2008/08/31 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
php计算一个文件大小的方法
2015/03/30 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
django使用xadmin的全局配置详解
2019/11/15 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
家长会演讲稿范文
2014/01/10 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书