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 相关文章推荐
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
Node.js编码规范
Jul 14 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
JavaScript实现MIPS乘法模拟的方法
Apr 17 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
Oct 13 Javascript
React入门教程之Hello World以及环境搭建详解
Jul 11 Javascript
vue使用中的内存泄漏【推荐】
Jul 10 Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 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
ajax php 实现写入数据库
2009/09/02 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
Python中Class类用法实例分析
2015/11/12 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
运动会通讯稿300字
2014/02/02 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
公司给客户的感谢信
2015/01/23 职场文书
医德医风自我评价2015
2015/03/03 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
初三化学教学反思
2016/02/22 职场文书
施工安全协议书
2016/03/22 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL