javascript 7种继承-- 寄生式继承分析(5)

news2024/11/18 17:47:13

文章目录

    • 概要
    • 继承的进化史
    • 技术名词解释
    • 寄生式继承
    • 案列分析
    • 源代码解析
    • 效果图
    • 小结

概要

这阵子在整理JS的7种继承方式,发现很多文章跟视频,讲解后都不能让自己理解清晰,索性自己记录一下,希望个位发表需要修改的意见,共勉之。
部分文章总结出来的数据可能是错误的,网络上太多数据了,有些不严谨,当然我也可能是其中一人,如果有问题,欢迎提出来,共同进步。

继承的进化史

JS的7种并不是逐级进化的(个人觉得~),可以参考下图:

在这里插入图片描述

技术名词解释

  • 原型式继承:返回一个空的构造函数所创建的实例,并该构造函数的prototype指向需要继承的对象,说白了就是直接浅拷贝copy一个新的对象给你用,可以参考原型式继承的一句话代码:let parent2 = Object.create(obj);
  • 工厂模式:定义一个创建对象的方法,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

寄生式继承

说的寄生式继承,不得不提到上一篇文章的原型式继承,因为原型式继承无法传参,对父类部分属性重写只能在上下文中,通过 .操作符操作。而寄生式继承就是封装好一个函数,对原型式继承的实例化对象进行再加工,也是通过.操作符,不过环境上下文切换到了函数。这个也就是我们熟悉的设计模式之一工厂模式,既美化了代码,也实现了复用。

即原型式继承+工厂模式=寄生式继承


案列分析

  • 父类:parentObj,要被继承的对象,可以理解为人。
  • 子类:childrenFactory,创建子类的工厂,不同的工厂,可以代表不同的工种或者说是职业。
  • 实例:person1 ,person2,实例化的子类,一般实例化后数据就分开了,复合数据类型要注意…

父类属性:

  1. name:父类属性,每个人都有名字 基础数据类型
  2. data:父类属性,个人的一些数据 复合数据类型,可以理解为个人的收藏,有人喜欢红酒,有人喜欢首饰 这里有BUG,数据混乱问题。
  3. sayData:父类方法,用来打印等下误操作的数据问题,打印BUG的地方,这边直接打印复合对象里面单独的属性,因为如果直接打印data,则永远指向最新的内存区域,也就是最后面修改的值,看不出变化…
  4. setData:父类方法,用于修改 data.a ,为了查看数据混乱。
  5. job:子类属性,代表工作,这里用于展示子类自带属性的一个实现,就是父子类总要有区别的嘛~
  6. sayJob:子类方法,用于打印工作内容。

源代码解析

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>寄生式继承</title>
  </head>
  <body>
    <h3>寄生式继承</h3>
    <h4>
      上一章节:原型式继承,里面对父类的重写都是放在上下文中通过
      .操作符来进行的,不是特别优雅。
    </h4>
    <h4>
      寄生式继承,就是在原型式继承基础上,通过一个函数对齐进行封装,而这类函数也是属于设计模式之一的工厂模式。
    </h4>
    <h4>优化:相对于原型式继承,可以传参。</h4>
    <h4>缺点:对象如果是复合数据类型的数据,会造成数据混乱。</h4>
    <script>
      let parentObj = {
        name: "未初始化的人",
        data: {
          a: 1,
          b: 2,
          c: 3,
        },
        sayData: function () {
          // 这里还不能直接打印对象出来,因为是一个指针,总是指向最新的数据...
          console.log(this.name +  " 的数据如下:");
          console.dir(this.data.a);
          console.dir(this.data.b);
          console.dir(this.data.c);
          console.log("我的数据结束====");
        },
        setDataA: function () {
          this.data.a = 666;
        },
      };

      // 这边仅使用Object.create() 来实现,避免代码量过多。
      function childrenFactory(name, job) {
        // 这里返回的是一个空的对象,obj放在了原型上了,所以只能修改temp中的数据。
        let temp = Object.create(parentObj);
        temp.name = name;
        temp.job = job ? job : "没工作";
        temp.sayJob = function () {
          console.log(`${this.name} 的工作是 ${this.job} ...`);
        };
        return temp;
      }

      let person1 = childrenFactory("钟先生", "程序员");
      let person2 = childrenFactory("刘小姐", "清洁阿姨");

      // 未修改数据
      console.log("===未修改数据的时候...");
      person1.sayData();
      person2.sayData();

      console.log("===修改钟先生一个人的数据的时候...");
      person1.setDataA();
      person1.sayData();
      person2.sayData();

      console.log(person1);
      console.log(person2);
    </script>
  </body>
</html>

效果图

部分同学不知道哪里修改了数据,这边贴上上方源码部分修改代码!

sayData: function () {
 // 这里还不能直接打印对象出来,因为是一个指针,总是指向最新的数据...
  console.log(this.name +  " 的数据如下:");
  console.dir(this.data.a);
  console.dir(this.data.b);
  console.dir(this.data.c);
  console.log("我的数据结束====");
}

console.log("===修改钟先生一个人的数据的时候...");
person1.setDataA();  // 就是这一句。
person1.sayData();
person2.sayData();

在这里插入图片描述
在这里插入图片描述

小结

  • 优化:相对于原型式继承,通过工厂模式,行进了更好的封装,由于有了函数,也实现了复用。
  • 缺点:原型链继承,原型式继承,寄生式继承,都存放复合数据类型数据混乱问题。

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

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

相关文章

C++多线程编程(第一章 多线程基本使用)

C 11&#xff1b; C 14; C 17; C 20&#xff1b; 1、为什么要多线程 任务分解 耗时的操作&#xff0c;任务分解&#xff0c;实时响应 数据分解 充分利用多核CPU处理数据 数据流分解 读写分离&#xff0c;解耦合设计 2、相关代码 1、初步&#xff1a; join(),detach() …

【数学建模】时间序列分析

文章目录 1. 条件2. 模型分类3. SPSS处理时间序列 1. 条件 1.使用于具有时间、数值两种要素 2.数据具有周期性可以使用时间序列分解 2. 模型分类 叠加模型【YTSCI】 序列的季节波动变化越来越大&#xff0c;反映变动之间的关系发生变化乘积序列【YTSC*I】 时间序列波动保持恒…

JavaSwing+MySQL的学生选课系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88101629?spm1001.2014.3001.5503 Jdk&#xff1a;1.8 MySQL&#xff1a;5.7 功能&#xff1a;可以进行选课与查看学生基本资料 在这里插入图片描述

Jmeter GET 请求 参数为 Json 串且参数中存在变量的转化

目录 前言&#xff1a; 1.在 HTTP 请求下添加 BeanShell PreProcessor 前置处理器&#xff1a; 2.在 BeanShell PreProcessor 的实现&#xff1a; 3.在 HTTP 请求中的使用方式&#xff1a; 4.参数化的数据方式&#xff1a; 5.请求结果&#xff1a; 前言&#xff1a; 在 A…

网络流量监视器vnStat

什么是 vnStat &#xff1f; vnStat 是一个网络流量监视器&#xff0c;它使用内核提供的网络接口统计信息作为信息源。这意味着 vnStat 实际上不会嗅探任何流量&#xff0c;并且无论网络流量速率如何&#xff0c;都可以确保系统资源的轻度使用。 安装 在群晖上以 Docker 方式安…

Hive内部表和外部表

表类型详解 表分类 在Hive中,表类型主要分为两种 第一种&#xff1a;内部表 也叫管理表表目录会创建在集群上的{hive.metastore.warehouse.dir}下的相应的库对应的目录中。默认创建的表就是内部表 第二种&#xff1a;外部表 外部表需要使用关键字"external"&#xff…

勘探开发人工智能应用:地震层位解释

1 地震层位解释 层位解释是地震构造解释的重要内容&#xff0c;是根据目标层位的地震反射特征如振幅、相位、形态、连续性、特征组合等信息在地震数据体上进行追踪解释获得地震层位数据的方法。 1.1 地震信号、层位与断层 图1.1 所示为地震信号采集的过程&#xff0c;地面炮…

Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块

Sip网络音频对讲广播模块&#xff0c; sip网络寻呼话筒音频模块 一、模块介绍 SV-2101VP和 SV-2103VP网络音频对讲广播模块 是一款通用的独立SIP音频功能模块&#xff0c;可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议…

ks webdid 滑块注册

web和app其实都一样&#xff0c;主要是针对于设备进行风控&#xff0c;web设备叫webdid; webdid注册出来&#xff0c;过了ks滑块激活&#xff0c;测试了主页&#xff0c;评论等接口都可以跑&#xff0c;平均也就2s注册一个&#xff0c;如果开并发那就更快了&#xff1b; 不过一…

React Native 0.72 版本,带来诸多更新

经过漫长的等待,React Native 终于迎来了0.72 版本,此处版本带来了Metro重要的功能更新、性能优化、开发人员体验的改进以及其他一些重要的变化。我们可以从下面的链接中获取此次版本更新的内容:0.72更新内容 一、Metro 新功能 众所周知,Metro 是 React Native 默认的 Jav…

图像处理之hough圆形检测

hough检测原理 点击图像处理之Hough变换检测直线查看 下面直接描述检测圆形的方法 基于Hough变换的圆形检测方法 对于一个半径为 r r r&#xff0c;圆心为 &#xff08; a , b &#xff09; &#xff08;a,b&#xff09; &#xff08;a,b&#xff09;的圆&#xff0c;我们将…

模拟量采集S_ITR函数(信捷C语言FC)

模拟量采集和转换函数非常简单,这里不再介绍,想了解具体算法的可以查看下面博客文章: PLC模拟量输入 模拟量转换FC S_ITR_博途模拟量转换程序_RXXW_Dor的博客-CSDN博客模拟量采集、工业现场应用特别广泛、大部分传感器的测量值和输出信号都是线型关系,所以我们可以利用线性…

SpringBoot中定时任务开启多线程避免多任务堵塞

场景 SpringBoot中定时任务与异步定时任务的实现&#xff1a; SpringBoot中定时任务与异步定时任务的实现_霸道流氓气质的博客-CSDN博客 使用SpringBoot原生方式实现定时任务&#xff0c;已经开启多线程支持&#xff0c;以上是方式之一。 除此之外还可通过如下方式。 为什…

对话商汤王晓刚:“百模大战”下半场,如何才能突出重围?

点击关注 文 | 姚悦 今年最早发布的那批大模型&#xff0c;现在怎么样了&#xff1f; 近期&#xff0c;商汤科技宣布“商汤日日新SenseNova”大模型体系完成了第一次重大迭代。这距离其发布过去3个月时间。 “每天不断接到用户调用&#xff0c;收到建议反馈后&#xff0c;每隔…

Java开发基础系列(十二):集合对象(List接口)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(十二)&#xff1a;集合对象(List接口) ⏱️ 创作时间…

【技术】国标GB视频平台设备接入EasyCVR后,如何获取RTMP与RTSP视频流

安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比…

esp32_arduino的开发库安装笔记

1.1 Arduino软件下载与安装 Arduino官网下载地址&#xff1a;https://www.arduino.cc/en/software。 1.2在线安装 选择文件 - 首选项。 在附加开发板管理器网址中添加以下链接中的一个。 (1)Stable release link: https://raw.githubusercontent.com/espressif/arduino-es…

2023第二届中国绿色钢铁国际大会 演讲嘉宾更新

2023第二届中国绿色钢铁国际峰会将于9月21日-22日在上海举办&#xff0c;本次会议线上线下同步举行。 峰会将从钢铁行业上中下游全产业链视角出发&#xff0c;聚焦能源及原料结构创新&#xff0c;传统高炉技术路线低碳化创新&#xff0c;氢能冶金、二氧化碳捕集、利用或储存技…

借降本增效之名,探索开闭原则架构设计

引语 在我们的研发生产活动中&#xff0c;经常会遇到如下类似的疑惑&#xff1a; 业务和技术在公司组织活动中&#xff0c;究竟应该各扮演什么样的角色&#xff1f; 技术的目的是什么&#xff1f; 研发生产活动中&#xff0c;如何提高生产事故发生的下限&#xff1f; 如何充…

el-table表格自动滚动

实现效果如下&#xff1a; 功能点&#xff1a; 1. 当表格内容超出时&#xff0c;自动滚动&#xff0c;滚动到最后一条之后在从头滚动。 2. 表格中的数据会定时刷新&#xff0c;刷新后数据更新。 3. 鼠标移入表格中&#xff0c;停止滚动&#xff1b;移出后&#xff0c;继续滚…