[JS设计模式]Mixin Pattern

Mixin是一个对象,我们可以使用它来为另一个对象或类添加可重用的功能,而无需使用继承。我们不能单独使用mixins:它们的唯一目的是在没有继承的情况下向对象或类添加功能。

假设对于我们的应用程序,我们需要创建多个狗。然而,我们创建的基本狗没有任何属性,只有一个name属性。

class Dog {constructor(name) {this.name = name;}
}

一只狗能做的不仅仅是有一个名字。它应该会叫,会摇尾巴,会玩!我们可以创建一个mixin,为我们提供bark, wagTail和play属性,而不是直接添加到Dog类中。

const dogFunctionality = {bark: () => console.log("Woof!"),wagTail: () => console.log("Wagging my tail!"),play: () => console.log("Playing!"),
};

我们可以用Object.assigndogFunctionality添加到Dog原型中。这样Dog的每个新实例都可以访问dogFunctionality的属性,因为它们被添加到Dog的原型中!

class Dog {constructor(name) {this.name = name;}
}const dogFunctionality = {bark: () => console.log("Woof!"),wagTail: () => console.log("Wagging my tail!"),play: () => console.log("Playing!"),
};Object.assign(Dog.prototype, dogFunctionality);

现在可以创建我们的第一个宠物叫卡迪。正如我们刚刚将dogFunctionality mixin添加到Dog的原型中一样,卡迪应该能够走路、摇尾巴和玩耍!

const pet1 = new Dog("Kadi");pet1.name; // Kadi
pet1.bark(); // Woof!
pet1.play(); // Playing!

虽然我们可以在没有继承的情况下使用mixin添加功能,但是mixin本身可以使用继承。
大多数哺乳动物(除了海豚…也许更多)也能走路和睡觉。狗是哺乳动物,应该能够走路和睡觉。

接下来创建一个animalFunctionality mixin,它有 walksleep 属性。

const animalFunctionality = {walk: () => console.log("Walking!"),sleep: () => console.log("Sleeping!"),
};

walksleep属性通过 Object.assign方法添加到dogFunctionality原型中。在这个例子中, dogFunctionality是目标对象。

const animalFunctionality = {walk: () => console.log("Walking!"),sleep: () => console.log("Sleeping!"),
};const dogFunctionality = {bark: () => console.log("Woof!"),wagTail: () => console.log("Wagging my tail!"),play: () => console.log("Playing!"),walk() {super.walk();},sleep() {super.sleep();},
};Object.assign(dogFunctionality, animalFunctionality);
Object.assign(Dog.prototype, dogFunctionality);

完整示例代码

class Dog {constructor(name) {this.name = name;}
}const animalFunctionality = {walk: () => console.log("Walking..."),sleep: () => console.log("Sleeping..."),
};const dogFunctionality = {__proto__: animalFunctionality,bark: () => console.log("Woof!"),wagTail: () => console.log("Wagging my tail!"),play: () => console.log("Playing!"),walk() {super.walk();},sleep() {super.sleep();}
};Object.assign(Dog.prototype, dogFunctionality);const pet1 = new Dog("Kadi");console.log(pet1.name);
pet1.bark();
pet1.wagTail();
pet1.walk();

请添加图片描述

小知识

Object.assign()

静态方法将一个或者多个源对象中所有可枚举自有属性复制到目标对象,并返回修改后的目标对象。

[语法]
Object.assign(target, ...sources)
[参数]
  • [target]

    需要应用源对象属性的目标对象,修改后将作为返回值。

  • [sources]

    一个或多个包含要应用的属性的源对象。

[返回值]

修改后的目标对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统中跟TCP相关的系统配置项

TCP连接保活 参考 《Nginx(三) 配置文件详解 - 基础模块》3.18章节 net.ipv4.tcp_keepalive_intvl:设置TCP两次相邻探活检测的间隔时间。默认75秒,单位是秒,对应配置文件/proc/sys/net/ipv4/tcp_keepalive_intvl;net.ipv4.tcp_kee…

form-data、x-www-form-urlencoded、raw 和 binary

在 Postman 中,有四种常见的请求体格式,分别是 form-data、x-www-form-urlencoded、raw 和 binary。它们的区别如下: form-data form-data 格式通常用于上传文件或二进制数据。在 Postman 中,你可以通过选择 Body 标签页&#x…

【错误记录/js】保存octet-stream为文件后数据错乱

目录 说在前面场景解决方式其他 说在前面 后端:go、gin浏览器:Microsoft Edge 120.0.2210.77 (正式版本) (64 位) 场景 前端通过点击按钮来下载一些文件,但是文件内容是一些非文件形式存储的二进制数据。 后端代码 r : gin.Default()r.Stat…

MyBatis见解2

5.MyBatis的原始Dao开发-了解 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。我们的课程讲解也主要以接口代理开发方式为主。在第4节已经…

项目功能需求

需求分解做法记录 功能&#xff1a;先按名称分组然后&#xff0c;组内从低到高排序&#xff0c;然后每组排序 做法一&#xff1a; List<CruiseDetailOutputDto> result new ArrayList<CruiseDetailOutputDto>();List<CruiseDetailOutputDto> journeyCrui…

冒泡排序之C++实现

描述 冒泡排序算法是一种简单的排序算法&#xff0c;它通过将相邻的元素进行比较并交换位置来实现排序。冒泡排序的基本思想是&#xff0c;每一轮将未排序部分的最大元素逐个向右移动到已排序部分的最右边&#xff0c;直到所有元素都按照从小到大的顺序排列。 冒泡排序的算法…

阿里云 ARMS 应用监控重磅支持 Java 21

作者&#xff1a;牧思 & 山猎 前言 今年的 9 月 19 日&#xff0c;作为最新的 LTS (Long Term Support) Java 版本&#xff0c;Java 21 正式 GA&#xff0c;带来了不少重量级的更新&#xff0c;详情请参考 The Arrival of Java 21 [ 1] 。虽然目前 Java 11 和 Java 17 都…

【Hugging Face】解决BART模型调用时KeyError: ‘new_zeros‘的问题

错误代码&#xff1a; tokenizer AutoTokenizer.from_pretrained("philschmid/bart-large-cnn-samsum") model AutoModelForSeq2SeqLM.from_pretrained("philschmid/bart-large-cnn-samsum")model.eval() model.to("cuda") loss 0 for i in …

前缀和+单调双队列+贪心:LeetCode2945:找到最大非递减数组的长度

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 单调双队列 贪心 题目 给你一个下标从 0 开始的整数数组 nums 。 你可以执行任意次操作。每次操作中&#xff0c;你需要选择一个 子数组 &#xff0c;并将这个子数组用它所…

python脚本 ssh工具 ssh上传文档 选择文档并上传到ssh服务器

此文分享一个python脚本,用于快速的定位、选择文档,并将其上传到指定的ssh服务器。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,我们需要定位并选择需要上传的文档 👇第三步,确认我们需要上传文档的ssh服务器 👇第四步,定位、选择…

Socket与Server通讯

ByteArrayOutputStream 对byte类型数据进行写入的类 &#xff0c;自动扩容&#xff0c;相当于一个中间缓冲层&#xff0c;将类写入到文件等其他outputStream。它是对字节进行操作&#xff0c;属于内存操作流 import java.io.ByteArrayOutputStream; import java.io.OutputStrea…

gulp和webpack的区别

Gulp和Webpack都是前端开发中常用的工具&#xff0c;但它们在功能和定位上存在一些差异。 首先&#xff0c;Gulp是一个工具链和构建工具&#xff0c;强调的是前端开发流程。它可以配合各种插件进行js压缩、css压缩、less编译等操作&#xff0c;实现自动化工作。在Gulp中&#…

Qt的简单游戏实现提供完整代码

文章目录 1 项目简介2 项目基本配置2.1 创建项目2.2 添加资源 3 主场景3.1 设置游戏主场景配置3.2 设置背景图片3.3 创建开始按钮3.4 开始按钮跳跃特效实现3.5 创建选择关卡场景3.6 点击开始按钮进入选择关卡场景 4 选择关卡场景4.1场景基本设置4.2 背景设置4.3 创建返回按钮4.…

2024 十大AI预测

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

偏最小二乘法中的“偏”的含义

问&#xff1a;偏最小二乘法中的“偏”是指什么意思&#xff1f; 答&#xff1a;偏最小二乘法&#xff08;Partial Least Squares&#xff0c;简称PLS&#xff09;中的“偏”指的是这种方法部分地考虑了响应变量的信息来进行预测变量的提取。与传统的最小二乘法相比&#xff0c…

Python 时间处理与数据分析利器:深入剖析 Arrow 模块的优势

写在开头 时间在数据分析中扮演着至关重要的角色&#xff0c;而选择适当的时间处理模块对于提高代码效率和可读性至关重要。本文将深入介绍 Arrow 模块&#xff0c;探讨其相对于其他时间处理模块的优势&#xff0c;以及在数据分析中的实际应用。 1. Arrow 模块概览 Arrow 模…

模式识别与机器学习(十一):Bagging

1.原理 Bagging [Breiman, 1996a] 是井行式集成学习方法最著名的代表.从名字即可看出&#xff0c;它直接基于自助采样法(bootstrap sampling)。给定包含m 个样本的数据集&#xff0c;我们先随机取出一个样本放入采样集中&#xff0c;再把该样本放回初始数据集&#xff0c;使得…

【JAVA】分布式链路追踪技术概论

目录 1.概述 2.基于日志的实现 2.1.实现思想 2.2.sleuth 2.2.可视化 3.基于agent的实现 4.联系作者 1.概述 当采用分布式架构后&#xff0c;一次请求会在多个服务之间流转&#xff0c;组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问题&#xff1a;…

编程语言学习目录

文章目录 一篇入门系列C#Fortranerlang/elixirR语言Go语言Rust语言 一篇入门系列 文本处理神器awkbash shellclojure极简教程F#语言入门教程量子编程初步——Q#入门1小时快速入门Python如何用两个晚上教会妹纸PythonVIM使用进阶&#xff1a;VIM脚本初步写给Matlab用户的Python…

网络基础知识制作网线了解、集线器、交换机与路由器

目录 一、网线的制作 1.1、材料 1.2、网线的标准类别 二、集线器、交换机介绍 2.1、概念&#xff1a; 2.2、OSI七层模型 2.3、TCP/IP四层 三、路由器的配置 3.1、概念 3.2、四个模块 1、 网络状态 2、设备管理 3、应用管理 无人设备接入控制 无线桥接 信号调节…