web前端tips:js继承——组合继承

news2024/12/26 11:06:10

输入图片描述

上篇文章给大家分享了 js继承中的借用构造函数继承

web前端tips:js继承——借用构造函数继承

借用构造函数继承中,我提到了它的缺点

无法继承父类原型链上的方法和属性,只能继承父类构造函数中的属性和方法
父类的方法无法复用,每个子类实例都会创建一份方法的副本

有没有方法解决这个缺点捏?

组合继承

听名字,即可明白肯定是多个继承方法组合在一起实现js的继承,突出各自优点,互补各自缺点。

组合继承是JavaScript中实现继承的一种常见方式。它通过结合原型链构造函数来实现继承。

具体而言,组合继承通过在子类构造函数中调用父类构造函数,从而继承父类的属性,并且使用原型链继承父类的方法。

以下是实现组合继承的基本步骤:

  1. 创建父类构造函数:定义一个父类构造函数,用来初始化父类的属性和方法
  2. 创建子类构造函数:定义一个子类构造函数,通过调用父类构造函数来继承父类的属性,并设置子类自己的属性。
  3. 继承父类的方法:将子类的原型对象设置为父类的实例,从而继承父类的方法。
  4. 添加子类特有的方法:在子类的原型对象上添加子类特有的方法。
  5. 创建子类实例:通过子类构造函数创建子类的实例,并调用继承自父类的方法以及子类自己的方法。
// 1
function Parent(name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

// 2
function Child(name, age) {
  Parent.call(this, name);
  this.age = age;
}

// 3
Child.prototype = new Parent();

// 这行代码的作用是确保子类原型对象的`constructor`属性指向子类自身,而不是指向父类。因为在前面修改原型对象的过程中,`constructor`属性被覆盖为父类的构造函数
Child.prototype.constructor = Child;  

// 4
Child.prototype.sayAge = function() {
  console.log(this.age);
}

// 5
var child1 = new Child('Tom', 5);
child1.colors.push('black');
console.log(child1.name); // 输出 "Tom"
console.log(child1.age); // 输出 5
console.log(child1.colors); // 输出 ["red", "blue", "green", "black"]
child1.sayAge() // 输出 5

var child2 = new Child('Jerry', 4);
console.log(child2.name); // 输出 "Jerry"
console.log(child2.age); // 输出 4
console.log(child2.colors); // 输出 ["red", "blue", "green"]
child2.sayAge() // 输出 4

通过以上步骤,你就可以使用组合继承在JavaScript中实现父类和子类之间的继承关系。这种方式既能够继承父类的属性,又能够继承父类的方法,并且还能添加子类特有的方法。

优点

  • 子类实例能够拥有父类的属性和方法,包括通过原型继承得到的共享方法。
  • 子类实例能够拥有自己独有的属性和方法。
  • 使用原型链继承时,父类的原型方法可以在子类实例上直接访问,减少了内存占用。
  • 借用构造函数继承可以避免引用类型属性的共享问题。

缺点

  • 在使用组合继承时,每次创建子类实例都会调用一次父类的构造函数,导致父类的属性被重复定义。
  • 原型链继承会将父类的属性方法复制到子类的原型上,可能导致内存占用过大。
  • 组合继承需要调用两次父类的构造函数,一次是在子类的构造函数中调用 Parent.call(this),一次是通过 Child.prototype = new Parent() 实现原型继承。这样做既增加了调用次数,也可能导致父类构造函数中的逻辑被执行多次。

总结来说,组合继承是一种常用的继承方式,它既能够继承父类的属性和方法,又能够拥有自身独有的属性和方法。但它的缺点是在创建子类实例时会重复调用父类的构造函数,可能导致内存占用过大,并且需要额外处理父类构造函数中的逻辑。

结语

牵手 持续为你分享各类知识和软件 ,欢迎访问、关注、讨论 并留下你的小心心❤

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

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

相关文章

UE Json Operate 解析嵌套数组

演示如何使用 DTJsonOperate 插件,在蓝图中解析嵌套数组。 比如这个Json {"name": [[[1, 2]],[3, 4],[5, 6]] } 操作演示 最后打印 本功能需要插件支持,插件下载地址。

2023牛客多校第二场 G Link with Centrally Symmetric String(类马拉车)

2023牛客多校第二场 G Link with Centrally Symmetric Strings(类马拉车 最长回文后缀) 题目链接 大意:定义对称回文的回文中心可以是 间隔(偶回文中心) 或者 o / x / s / z (奇回文中心) 五种 , 定义匹配为 b/q d/p n/u o/o x/x s/s z/z 之间相互匹…

nvm安装使用与常见问题

前言 nvm是一个用来进行nodejs多个版本管理和切换的工具。这个工具的使用相当简单和方便,但是没想到我使用的时候却遇到了好些问题,这里记录一下顺便分享。 安装nvm 先去下载地址Releases coreybutler/nvm-windows GitHub下载,建议选择下…

批量记录收支明细,轻松通过收支占比图表轻松分析支出项目占比!

您是否希望更加直观地了解个人或企业的支出项目占比情况?是否想通过图表分析,快速定位支出的主要项目,并做出相应的调整?现在,我们的智能收支分析大师为您提供了一种智能化的解决方案!只需几步操作&#xf…

sliver C2 切换会话

使用中发现会话的切换直接输入sessions,显示会话 use 切换到新会话 在测试进程迁移的时候发现命令不好用 多次尝试,没有成功的

骨传导耳机戴久了头疼正常吗?骨传导耳机对健康有影响吗

骨传导耳机戴久了头疼正常吗?骨传导耳机对健康有影响吗 长时间佩戴骨传导耳机可能会引起一些人头疼的不适感,这可能是因为长时间的接触和震动影响了你的感知和舒适度。如果你遇到这样的问题,可以尝试以下几种解决方法: ⑴适当休…

第6章:支持向量机

间隔与支持向量 w为法向量,决定的是超平面的方向。b是偏移项,决定了超平面与原点之间的距离。 为什么最大化间隔,得到的就是最优平面呢? 当超平面没有正确划分正负样本时,几何间隔为负数。几何间隔,各个…

C++学习系列之DLL动态库使用

C学习系列之DLL动态库使用 啰嗦动态库的创建动态库的调用函数生成1.需要头文件函数定义(头文件)2.需要函数定义(函数文件)3.动态库中的头文件4.动态库中的主文件5.运行查看是否存在C#的调用的入口点6.C#调用 总结 啰嗦 项目需要&…

HSE是什么,好用的HSE系统推荐

阅读本文您将了解:1、HSE是什么;2、HSE在企业中的作用;3、好用的HSE系统推荐 一、HSE是什么 HSE是"Health, Safety, and Environment"(健康、安全和环境)的缩写。它指的是一个在工作场所、生产过程和社会活…

已解决:Module‘xxx’存在

1.问题如图,进入项目结构,找到模块检查是否仍有同名文件。 2.选中文件,点“—”号,应用,确定即可 3.重新新建即可成功。

【C语言程序设计】C语言基本数据类型与表达式(思考题)

思考题 1、C语言的主要特点有哪些? ①简单紧凑、灵活方便,②是结构化的语言,③运算符丰富,④是一种高效的语言,⑤可直接对硬件进行操作,⑥具有较好的可移植性。 高效性:C语言是一种高级编程语言…

VUE3 Hooks的面向对象实现方式

本文会以三种形式实现一个组件,该组件实现以下功能: 1.显示一个数字(可从prop给初始值)和一个添加按钮; 2.点击添加按钮数字增加; 3.当数字大于5时,数字颜色变红,并提交error事件…

Redis持久化——RDB快照

介绍 我们知道Redis是运行在内存中的数据库,那么当我们关闭Redis服务器后,内存中的数据会不会丢失? 当然是不会!因为Redis有持久化机制,所谓持久化,就是将内存中的数据保存到磁盘文件上,以此来…

Zookeeper进阶篇 - Paxos协议算法、ZBA协议算法原理、Leader选举原理

Zookeeper底层原理篇,​让学习绚丽多彩起来!!!

Eigen 的简单使用 与 轨迹拟合代码的理解

工作中遇到一个问题&#xff0c;发到hmi的车辆引导线为斜的&#xff0c;有一说一&#xff0c;仔细看下这段代码&#xff0c;发现用到了Eigen库用来多项式曲线拟合&#xff0c;线性回归&#xff0c;矩阵向量计算等。 #include <iostream> #include <vector> #inclu…

001-Nacos 服务注册

目录 Nacos介绍注册中心架构面临问题源码分析实例注册-接口实例注册-入口实例注册-创建一个(Nacos)Service实例注册-注册(Nacos)Service Nacos 介绍 Dynamic Naming and Configuration Service 动态的命名和配置服务 反正可以实现注册中心的功能 注册中心架构 服务提供者 …

做好需求分析的4大关键认知

探索如何正确的需求分析&#xff1f;本文详细介绍了4大关键点&#xff0c;帮助您明确用户与产品需求、深入挖掘用户动机&#xff0c;并为产品经理提供筛选需求的实用建议。 一、什么是需求分析以及重要性 需求分析指的是在建立一个新的或改变一个现存的产品时&#xff0c;确定新…

人工智能在网络安全中的应用: 分析人工智能、机器学习和深度学习等技术在预测、检测和应对网络攻击中的作用

第一章&#xff1a;引言 随着信息技术的迅猛发展&#xff0c;网络安全已成为当今社会不容忽视的重要议题。网络攻击手法日益复杂&#xff0c;传统的防御方法已经不再足够。在这一背景下&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐渐崭露头角&#xff0c;为网络安…

vue3学习笔记(一)

一、API风格 Vue 的组件可以按两种不同的风格书写&#xff1a;选项式 API 和组合式 API。 二、组合式API 1.&#xff08;组合式 API 的核心思想是直接在函数作用域内定义响应式状态变量&#xff0c;并将从多个函数中得到的状态组合起来处理复杂问题。这种形式更加自由&#x…

SummaryWriter

SummaryWriter tb_writer SummaryWriter("swin_transformer_loss_acc") 第一个参数 log_dir : 用以保存summary的位置 add_scalar()函数的目的是添加一个标量数据&#xff08;scalar data&#xff09;到summary中 重要的常用的其实就是前三个参数&#xff1a; &…