理解学习JavaScript当中的混入操作(Mixin)

ops/2024/10/19 4:37:12/

介绍

混入(Mixin) 是一种代码复用的模式。它的主要目的是将一个对象的功能“混入”到另一个对象中,而不是通过继承。这种模式通常被用来在多个类之间共享功能,而无需使用复杂的继承层次。

在 JavaScript 中,混入可以通过显式和隐式的方式实现

显式混入

显式混入是指通过明确地将一个对象的属性或方法复制到另一个对象中。可以使用 Object.assign() 或者手动将方法附加到目标对象上。这种方法的好处是清晰明确,可以控制哪些方法被混入。

例子1:使用 Object.assign() 实现显式混入

// 定义一个混入对象
const Mixin = {sayHello() {console.log('Hello from Mixin!');},sayGoodbye() {console.log('Goodbye from Mixin!');}
};// 定义一个类
class Person {constructor(name) {this.name = name;}introduce() {console.log(`My name is ${this.name}`);}
}// 显式混入:将 Mixin 的方法显式混入到 Person 的原型中
Object.assign(Person.prototype, Mixin);// 测试
const john = new Person('John');
john.introduce();  // 输出: My name is John
john.sayHello();   // 输出: Hello from Mixin!
john.sayGoodbye(); // 输出: Goodbye from Mixin!

通过 Object.assign() 将 Mixin 对象的所有方法复制到了 Person 类的原型上,这样 Person 的实例就可以直接调用 Mixin 中定义的方法

隐式混入

隐式混入是指通过间接的方式将功能添加到另一个对象中,通常使用代理、闭包或某些设计模式来实现。隐式混入常常不直接复制或继承方法,而是通过调用来间接使用另一对象的方法。

例子2:使用组合和委托实现隐式混入

// 定义一个混入对象
const Flyer = {fly() {console.log('I can fly!');}
};// 定义一个类
class Bird {constructor(name) {this.name = name;this.flyer = Flyer;  // 通过组合的方式隐式混入 Flyer}introduce() {console.log(`I am a bird named ${this.name}`);}// 通过代理调用 Flyer 的 fly 方法fly() {this.flyer.fly();}
}// 测试
const eagle = new Bird('Eagle');
eagle.introduce(); // 输出: I am a bird named Eagle
eagle.fly();       // 输出: I can fly!

Bird 类并没有直接继承或复制 Flyer 的方法,而是通过组合的方式将 Flyer 混入到 Bird 中。fly() 方法被代理给了 Flyer,因此我们看起来好像是在 Bird 实例中调用了 Flyer 的 fly() 方法。

显式和隐式的区别和优缺点

显式混入 vs 隐式混入的区别

显式混入:你明确地将一个对象的方法或属性赋值到另一个对象上,这使得它们变成了目标对象的一部分。在代码层面上,方法是直接可见的,清晰直观。
隐式混入:你并没有真正将方法或属性复制到目标对象,而是通过某种方式(如组合、代理等)将功能引入。这在代码上不如显式混入直观,但有时更灵活。

混入的优缺点

优点:

避免了多重继承的复杂性,可以在多个对象之间共享代码。
灵活性高,尤其是显式混入,允许我们仅混入所需的方法。

缺点:

过度使用混入可能导致代码维护困难,尤其是隐式混入,代码行为可能变得不直观。
混入的冲突问题:当多个混入对象中的方法名称相同时,可能会导致冲突,需要特别注意。


http://www.ppmy.cn/ops/126634.html

相关文章

Python网络爬虫

随着互联网的迅猛发展,数据成为了新的“石油”。人们对于信息的需求日益增涨,尤其是在市场分析、学术研究和数据挖掘等领域。网络爬虫作为一种自动提取网络数据的技术,因其强大的能力而备受关注。而Python,凭借其简洁的语法和丰富…

10.13论文阅读

通过联合学习检测和描述关键点增强可变形局部特征 摘要 局部特征提取是计算机视觉中处理图像匹配和检索等关键任务的常用方法。大多数方法的核心理念是图像经历仿射变换,忽略了诸如非刚性形变等更复杂的效果。此外,针对非刚性对应的新兴工作仍然依赖于…

Ping32运维中心工具:提升企业IT管理效率的利器

在当今数字化时代,信息技术的高效管理对企业的运营至关重要。Ping32运维中心工具应运而生,为企业提供了一整套便捷的运维解决方案,帮助IT团队高效管理网络与设备,确保业务连续性。 一体化监控平台 Ping32运维中心工具提供了一体化…

jmeter 从多个固定字符串中随机取一个值的方法

1、先新增用户参数,将固定值设置为不同的变量 2、使用下面的函数,调用这写变量 ${__RandomFromMultipleVars(noticeType1|noticeType2|noticeType3|noticeType4|noticeType5)} 3、每次请求就是随机取的值了

【C++标准模版库】unordered_map和unordered_set的介绍及使用

unordered_map和unordered_set 一.unordered_set1.unordered_set类的介绍2.unordered_set和set的使用差异 二.unordered_map1.unordered_map和map的使用差异 三.unordered_multimap/unordered_multiset四.unordered_map/unordered_set的哈希相关接口 一.unordered_set 1.unord…

Vscode 如何自动排序导入语句

前言 在日常的 React 项目开发中,我们经常需要导入各种模块和组件。然而,随着项目规模的扩大,import 语句容易变得混乱不堪,这不仅增加了代码的可读性难度,还可能导致不必要的冲突和错误。 幸运的是,VSCod…

机器学习:opencv--风格迁移

目录 前言 一、代码及步骤解释 1.图片与处理 2.加载模型 3.输出图像 前言 风格迁移(Style Transfer)是一种计算机视觉技术,旨在将一种图像的艺术风格应用到另一种图像上,同时保持其内容。 一、代码及步骤解释 1.图片与处理 …

道观小程序系统架构设计与实现开发案例分析

道观小程序是一款专为道教信仰者和文化爱好者设计的移动应用,旨在提供一站式服务体验。它融合了道教文化传播、道观信息查询、在线供奉祈福以及信众互动交流等多重功能,让用户能够轻松获取道观的最新资讯,参与宗教活动,享受便捷的…