JavaScript 中的灵活编程模式-行为委托

news/2024/7/19 14:32:44 标签: javascript, 开发语言, 前端, js, ecmascript

JavaScript 中的行为委托是一种编程模式,它通过对象之间的原型链关系来共享属性和方法。相比传统的继承,行为委托更加灵活和可扩展,可以避免类层次结构的复杂性,并促进代码的重用和组合。

1. 委托与继承的区别

继承是一种将属性和方法从一个对象复制到另一个对象的方式,而行为委托则是通过关联两个对象的原型链来共享属性和方法。继承创建了一个类层次结构,而委托创建了一个对象之间的关联。

我们可以通过 Classextends 关键字实现继承。(注意:继承一般是把公共行为封装好,供’后代’使用)

以下是继承的示例:

js">class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

class Dog extends Animal {
  constructor(name) {
    super(name);
  }
  speak() {
    console.log(`${this.name} barks.`);
  }
}

const dog = new Dog('Fido');
dog.speak(); // 输出 'Fido barks.'

2. 显式行为委托

显式行为委托是通过将一个对象的属性或方法直接指向另一个对象来实现的。这可以使用 Object.create() 方法来创建一个新对象,并将其原型指向另一个对象。

js">const delegateObj = {
  foo() {
    console.log('foo');
  }
};

const targetObj = Object.create(delegateObj);

targetObj.foo(); // 输出 'foo'

上面的代码中,我们创建了一个 delegateObj 对象,它有一个 foo 方法。然后,我们使用 Object.create() 方法创建了一个新对象 targetObj,并将其原型指向 delegateObj。这样,当我们调用 targetObj.foo() 时,它会在 delegateObj 中查找 foo 方法并执行。

3. 隐式行为委托

隐式行为委托是通过对象之间的原型链关系来实现的。当一个对象无法找到属性或方法时,它会沿着原型链向上查找,直到找到对应的属性或方法或者到达原型链的末端。

js">const delegateObj = {
  foo() {
    console.log('foo');
  }
};

const targetObj = Object.create({});

Object.setPrototypeOf(targetObj, delegateObj);

targetObj.foo(); // 输出 'foo'

上面的代码中,我们创建了一个 delegateObj 对象,它有一个 foo 方法。然后,我们创建了一个空对象 targetObj,并使用 Object.setPrototypeOf() 方法将其原型设置为 delegateObj。这样,当我们调用 targetObj.foo() 时,它会沿着原型链向上查找,在 delegateObj 中找到 foo 方法并执行。

4. 委托与继承

行为委托是一种更灵活和可扩展的编程模式,相比传统的继承,它可以避免类层次结构的复杂性,并促进代码的重用和组合。通过委托,我们可以将不同对象之间的共享行为抽象出来,并将其复用于其他对象,从而提高代码的可维护性和可扩展性。

行为委托确实是一种强大的编程模式,可以使我们更好地组织和重用代码。在实际开发中,我们可以根据需要选择显式或隐式行为委托,并结合其他编程技巧来实现更加灵活和可维护的代码。同时继承也是非常不错的解决方案。


http://www.niftyadmin.cn/n/5096852.html

相关文章

Debezium监控Oracle数据库

参照: 不想引入MQ?不妨试试 Debezium Debezium监控Oracle数据库遇到的坑_debezium 代码监听oracle cdc-CSDN博客 基于 LogMiner 和 Debezium 构建可用于生产实践的 Oracle 实时数据采集工具_架构_丁杨_InfoQ精选文章

vue视频直接播放rtsp流;vue视频延迟问题解决;webRTC占cpu太大卡死问题解决

播放多个视频 <div class"video-box"><div class"video"><iframe style"width:100%;height:100%;" name"ddddd" id"iframes" scrolling"auto" :src"videoLeftUrl"></iframe>&l…

餐饮业的现状能拉动消费市场吗?

有关“餐饮店倒闭成趋势”话题的讨论在互联网上愈加热烈起来&#xff0c;足以说明“全民消费&#xff0c;拉动经济”的希望尚未变成现实。从笔者寄居养老的风水宝地——国家AAAA级旅游景区崇州市街子古镇的餐饮店&#xff0c;在今年中秋、国庆双节假日期间火了几天后生意又复归…

基于SpringBoot的医疗预约服务管理系统

基于SpringBootVue的医疗预约服务管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登陆界面 管理员界面 医生界面 会员界面 摘要 基于SpringBoot的…

[ConvNet]卷积神经网络概念解析

在初步接触了深度学习以后&#xff0c;我们把目光投向对于一些图像的识别。 其实在d2l这本书中&#xff0c;我们接触过用深度神经网络去识别一个图像&#xff0c;并且对其进行一个分类操作&#xff0c;核心原理是将图像展开成一维tensor&#xff0c;然后作为特征进行检测。 其…

电压放大器在声学振动中的应用研究

电压放大器是声学振动研究领域中一种重要的设备&#xff0c;被广泛应用于音响系统、测量仪器和实验室设备等领域。它可以将来自信号源的小电压信号放大到足够大的幅度&#xff0c;以驱动各种声学振动设备&#xff0c;并提供清晰、高保真的声音效果。 电压放大器在音响系统中扮演…

【Python机器学习】零基础掌握TransformedTargetRegressor预处理组件

如何对不同类型的数据进行预处理? 在日常生活中,我们经常会遇到需要分析和解释多种类型的数据。比如在电商平台上,可能需要对商品的销售数据进行分析,以便更好地了解市场需求和消费者行为。然而这样的数据通常包括多种类型,比如数值型(如价格、销量等)和分类型(如商品…

NTFS磁盘格式读写工具Tuxera NTFS 2023 for Mac中文破解版v2023含最新激活序列号

Tuxera NTFS 2023 Mac 是一个NTFS文件系统驱动程序&#xff0c;为解决Mac上不能对NTFS格式硬盘进行访问和读写而生。实现苹果Mac OS X系统读写Microsoft Windows NTFS文件系统&#xff0c;在硬盘、U盘等外接设备中进行全面访问、删除、修改等相关操作。 tuxera ntfs 2023 破解…