坚持造轮子第六天 - Mixin -装备合成路径

简介: 坚持造轮子第六天 - Mixin -装备合成路径

造轮子计划


计划天天变


  • 框架








  • 原生Ajax


  • JS基础


  • Compose


  • Promise


  • Promise.all/race


  • 路由


  • new


  • [call/apply/bind](./call apply bind)


  • Object.create


  • 深拷贝、浅拷贝


  • 算法、设计模式


  • 二分查找


  • 快排


  • 二分查找


  • 冒泡排序


  • 选择排序


  • 订阅发布


  • 斐波那契算法


  • 去重


Mixin是什么


Mixin又叫做混入可能百分之九十九的前端小伙伴都是通过Vue的mixin认识这个词的是吧。不过这确实不是小尤同学发明的。


Mixin其实就是对多重继承的实现。


在《松本行弘的程序世界》一书中,作者列举了以下三点:结构复杂化:如果是单一继承,一个类的父类是什么,父类的父类是什么,都很明确,因为只有单一的继承关系,然而如果是多重继承的话,一个类有多个父类,这些父类又有自己的父类,那么类之间的关系就很复杂了。优先顺序模糊:假如我有A,C类同时继承了基类,B类继承了A类,然后D类又同时继承了B和C类,所以D类继承父类的方法的顺序应该是D、B、A、C还是D、B、C、A,或者是其他的顺序,很不明确。功能冲突:因为多重继承有多个父类,所以当不同的父类中有相同的方法是就会产生冲突。如果B类和C类同时又有相同的方法时,D继承的是哪个方法就不明确了,因为存在两种可能性。


算了还是说点人类的语言。


就好比王者荣耀


网络异常,图片无法展示
|

image-20201106164210766


比如泣血之刃 需要用小吸血刀的吸血能力和巨剑的攻击力的加成。但是小吸血刀和巨剑谁也不是谁的爹。那么你合成泣血的时候就需要多重继承能力了。懂了吧。


那么在各个语言都是如何进行多重继承能力。


  • Java选择的规格继承 也就是使用interface实现多重继承


  • Ruby选择世界提供了Mixin


  • 而JS肿么就没有呢 需要我们实现


需求


如果用Jest用例便表示就是这样


test("Mixin 实现", () => {
  const mixin = require("../index");
  const Base = class {};
  const fn = jest.fn();
  // 小吸血刀
  const canLog = {
    fn,
  };
  mixin(Base, canLog);
  // 泣血之刃
  const obj = new Base()
  obj.fn("haha");
  const calls = fn.mock.calls;
  expect(calls.length).toBe(1);
  expect(calls[0][0]).toBe("haha");
});


我们需要实现一个合成函数完成装备合成,懂了吧。


实现


原型链走一波 就行了,不解释。


module.exports = (base, obj) => {
  for (var key in obj) {
    if (base.prototype.hasOwnProperty(key)) {
      throw new Error(
        "Don't allow override existed prototype method. method: " + key
      );
    }
    base.prototype[key] = obj[key];
  }
};


测试


网络异常,图片无法展示
|

image-20201106165047821


OK 任务完成


升华


其实混入就是实现了 设计模式的 【组合模式】这个后面说。



本文使用 mdnice 排版


网络异常,图片无法展示
|


  • 这是我们团队的开源项目 element3


  • 一个支持 vue3 的前端组件库


相关文章
|
1月前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
36 2
|
4月前
|
JavaScript 前端开发 UED
【绝技大公开】Vue.js高手教你如何从零到英雄,构建梦幻电商平台前端!
【8月更文挑战第30天】本文通过对比传统网页开发方式,介绍了使用Vue.js及其生态构建电商平台前端的方法。从初始化项目到配置路由、状态管理,再到实现首页、商品列表与详情页,每个环节都提供了具体代码示例,展示了Vue.js在提升开发效率与应用可维护性方面的优势。适合希望了解现代前端技术栈的开发者阅读。通过本教程,读者可以学习到如何利用Vue Router、Vuex等工具搭建完整的Web应用。
57 0
|
7月前
|
监控 Linux Windows
装备神器edex-ui别人以为我很屌其实我只会if和else搬运代码
装备神器edex-ui别人以为我很屌其实我只会if和else搬运代码
79 1
星际争霸之小霸王之小蜜蜂(三)--重构模块
星际争霸之小霸王之小蜜蜂(三)--重构模块
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
100 1
|
人工智能 数据可视化 机器人
GIF动画渲染、让灯塔闪烁、创建航空动态图……ChatGPT代码解释器插件「不止于代码」
GIF动画渲染、让灯塔闪烁、创建航空动态图……ChatGPT代码解释器插件「不止于代码」
218 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10之一组sprite动画
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10之一组sprite动画
160 0
|
前端开发
好客租房45-react组件基础综合案例-6边界问题
好客租房45-react组件基础综合案例-6边界问题
97 0
好客租房45-react组件基础综合案例-6边界问题
|
Web App开发 JavaScript Android开发
#yyds干货盘点# Vue手动封装实现一个五星评价得效果
#yyds干货盘点# Vue手动封装实现一个五星评价得效果
297 0
#yyds干货盘点# Vue手动封装实现一个五星评价得效果
|
缓存 容器
「造个轮子」——cicada 设计一个配置模块(下)
在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。 因此我按照自己的想法创建了一个 issue ,同时将 cicada 升级到了 v1.0.2。