Mixin配合class实现多继承的绝佳妙用

本文探讨了JavaScript中使用mixin实现多继承的需求背景和常见方法,包括`extends`简单实现、早期mixin方法的问题以及不修改原型的实现。通过代码示例,分析了各种方式的优缺点,最后提出利用`super`解决相同方法覆盖的问题,旨在提高代码复用性和设计灵活性。
摘要由CSDN通过智能技术生成

什么是mixin

mixin一般翻译为“混入”、“混合”,
早期一般解释为:把一个对象的方法和属性拷贝到另一个对象上;
也可以简单理解为能够被继承的类,
最终目的是实现代码的复用。

从一个需求说起

为了使你能够最快的清楚我在说什么,我们从一个需求说起:

一个项目中有多个弹层需求;
一些是公共方法,比如点击关闭按钮关闭弹层;
一些弹层是可以拖动的,且有蒙层;
一些弹层是可以缩放的;
其他都是业务方法,无可复用性。

你可以先在心里想下,如果是你,你会怎样完成这个需求?

脑海中规划下

我们为公共方法写个类:BaseModal
为可拖动的弹层写个类:DragModal
为可缩放的弹层写个类:ScaleModal
为自定义的业务需求写个类:CustomModal

画个脑图的话,会是下面图片中的样子:

不同类之间的关系图

extends简单实现下

看代码

// 公共方法
class BaseModal {
   
  close(){
   
    console.log('close');
  }
}

// 可以拖动的弹层,我们写一个单独的类
class DragModal extends BaseModal {
   
  hasLayer = true;
  drag() {
   
    console.log('drag');
  }
}

// 可以缩放的弹层,我们写一个单独的类
class ScaleModal extends BaseModal {
   
  scale() {
   
    console.log('scale');
  }
}

// 业务方法
class CustomModal extends DragModal {
   
  close(){
   
    console.log('custom-close');
  }
  do() {
   
    console.log('do');
  }
}

let c = new CustomModal();
c.close(); // custom-close
c.drag(); // drag
c.do(); // do
c.hasLayer; // true

抛出问题

  • 如何使CustomModal能够同时继承DragModalScaleModal
  • 某个相同方法希望不覆盖,而是都执行

试试早期的mixin方法实现多继承

看代码

// 可以拖动的弹层,我们写一个单独的类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值