【 JS 】深入之继承的多种方式和优缺点

“生活是一幅绚丽的画,每一刻都是色彩的斑斓。在画布上,用坚韧的笔触勾勒出自己的世界,让每一幅画作都是奋斗的痕迹,成就属于自己的艺术之旅。” - 梵高

继承的多种方式

原型链继承

function Parent () {this.name = 'minifan'
}Parent.prototype.getName = function () {console.log(this.name)
}function Child () {
}Child.prototype = new Parent()
var child1 = new Child()
console.log(child1.getName()) // minifan

问题:

1.引用类型的属性被所有实例共享,举个例子:

function Parent () {this.names = ['minifan','qinqin'];
}function Child () {
}Child.prototype = new Parent();
var child1 = new Child()
child1.names.push('tuantuan')console.log(child1.names) // ["minifan","qinqin","tuantuan"]
var child2 = new Child()
console.log(child2.names) // ["minifan","qinqin","tuantuan"]

2.在创建 Child 的实例时,不能向Parent传参

2.借用构造函数(经典继承)

function Parent () {this.names = ['minifan','qinqin']
}function Child () {Parent.call(this)
}var child1 = new Child()
child1.names.push('tuantuan')
console.log(child1) // ["minifan","qinqin","tuantuan"]var child2 = new Child();
console.log(child2.names) // ["minifan","qinqin"]

优点:

1.避免了引用类型的属性被所有实例共享

2.可以在 Child 中向 Parent 传参

举个例子:

function Parent (name) {this.name = name
}function Child (name) {Parent.call(this,name)
}var child1 = new Child('minifan')
console.log(child1.name) // minifanvar child2 = new Child('qinqin')
console.log(child2.name) // qinqin

缺点:

方法都在构造函数中定义,每次创建实例都会创建一遍方法。

组合继承

原型链继承和经典继承双剑合璧。

function Parent (name) {this.name = namethis.colors = ['red','blue','green']
}Parent.prototype.getName = function () {console.log(this.name)
}function Child (name,age) {Parent.call(this,name)this.age = age
}Child.prototype = new Parent()
Child.prototype.constructor = Childvar child1 = new Child('minifan', '30')child1.colors.push('black')console.log(child1.name) // minifan
console.log(child1.age) // 30
console.log(child1.colors) // ['red','blue','green','black']var child2 = new Child('qinqin','18')console.log(child2.name) // qinqin
console.log(child2.age) // 18
console.log(child2.colors) // ['red','blue','green']

优点:融合原型链继承和构造函数的优点,是 JavaScript 中最常用的继承模式。

4. 原型式继承

function createObj (o) {function F() {}F.prototype = o;return new F();
}

就是 ES5 Object.create 的模拟实现,将传入的对象作为创建的对象的原型。

缺点:
包含引用类型的属性值始终都会共享相应的值,这点跟原型链继承一样。

var person = {name: 'minifan',friends: ['caidao','zhushu']
}var person1 = createObj(person)
var person2 = createObj(person)person1.name = 'person1'
console.log(person2.name) // minifanperson1.friends.push('tandou')
console.log(person2.friends) // ['caidao','zhushu','tandou']

注意:修改person1.name的值,person2.name的值并未发生改变,并不是因为person1和person2有独立的 name 值,而是因为person1.name = ‘person1’,给person1添加了 name 值,并非修改了原型上的 name 值。

5. 寄生式继承

创建一个仅用于封装继承过程的函数,该函数在内部以某种形式来做增强对象,最后返回对象。

function createObj (o) {var clone = Object.create(o)clone.sayName = function () {console.log('hi')}return clone;
}

缺点: 跟借用构造函数一样,每次创建对象都会创建一遍方法。

6. 寄生组合式继承

为了方便大家阅读,在这里重复一下组合继承的代码:

function Parent (name) {this.name = namethis.colors = ['red','blue','green']
}Parent.prototype.getName = function () {console.log(this.name)
}function Child (name,age) {Parent.call(this,name)this.age = age
}// 关键的三步
var F = function() {}F.prototype = Parent.prototype
Child.prototype = new F();var child1 = new Child('minifan','30')
console.log(child1) 

最后我们封装一下这个继承方法:

function object(o) {function F() {}F.prototype = o;return new F();
}function prototype(child,parent) {var prototype = object(parent.prototype)prototype.constructor = childchild.prototype = prototype
}// 当我们使用的时候:
prototype(Child,Parent)

引用《JavaScript高级程序设计》中对寄生组合式继承的夸赞就是:

这种方式的高效率体现它只调用了一次 Parent 构造函数,并且因此避免了在 Parent.prototype 上面创建不必要的、多余的属性。与此同时,原型链还能保持不变;因此,还能够正常使用 instanceof 和 isPrototypeOf。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。

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

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

相关文章

红队专题-开源漏扫-巡风xunfeng源码剖析与应用

开源漏扫-巡风xunfeng 介绍主体两部分:网络资产识别引擎,漏洞检测引擎。代码赏析插件编写JSON标示符Python脚本此外系统内嵌了辅助验证功能文件结构功能 模块添加IP三. 进行扫描在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/de587a6f6f694…

ai写作一键生成文章速度快

ai写作是一种基于人工智能技术的自动写作工具,它可以根据用户提供的主题或关键词,快速一键生成文章。与传统的手动写作相比,ai写作的速度更快,效率更高。下面小编就带大家一起来见识下ai写作一键生成文章的速度是如何之快&#xf…

【CSP试题回顾】202012-1-期末预测之安全指数

CSP-202012-1-期末预测之安全指数 解题代码 #include <iostream> #include <algorithm> using namespace std;int n, sum;int main() {cin >> n;for (int i 0; i < n; i){int w, s;cin >> w >> s;sum w * s;}sum max(sum, 0);cout <&…

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序&#xff0c;没有打包过&#xff0c;经过九牛二虎之力终于打包出来&#xff0c;在此感谢那些热于分享的前辈&#xff01; 本篇只讲打包运行和出现的问题 一、准备工作&#xff1a;提前下载相关资源包&#xff0c;否则在国内环境下可能因为网络问题…

ECharts 简要介绍及简单实例代码

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 提供了丰富的图表类型和交互能力&#xff0c;使用户能够通过简单的配置生成各种各样的图表&#xff0c;包括但不限于折线图、柱状图、散点图、饼图、雷达图、…

驾校避雷(不同地区情况不一样)

1-训练地点在哪&#xff0c;包车吗 2-学车一对一还是一对多&#xff0c;训练学时是多少(62) 3-驾校是否有自己的考场&#xff08;这里有坑&#xff0c;如果要去其他地方的话&#xff0c;小心产生的其他费用&#xff0c;问问是不是全包&#xff09; 4-费用是否包含考试费&#x…

Lwip之TCP服务端示例记录(1对多)

前言 实现多个客户端同时连接初步代码结构已经实现完成(通过轮训的方式) // // Created by shchl on 2024/3/8. // #if 1#include <string.h> #include "lwip/api.h" #include "FreeRTOS.h" #include "task.h" #include "usart.h&…

群辉docker安装sql server

安装步骤 开启群辉 SSH&#xff0c;通过 SSH 工具连接到群辉&#xff0c;运行下面的命令拉取mssql 2019 镜像 sudo docker pull mcr.microsoft.com/mssql/server:2019-latest然后在 docker 中就可以看到该镜像&#xff1a; 在群晖 docker 共享文件夹中创建 mssql2009 文件夹 …

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

蓝桥杯刷题--python-19--归并排序,离散化,hash,逆序数

505. 火柴排队 - AcWing题库 nint(input()) alist(map(int,input().split())) blist(map(int,input().split())) mod99999997 # map c[0 for i in range (n1)] # 归并排序模板 def _MergeSort(arr,l,r,tmp): if l>r: return 0 # 分治思想 midlr>>1 # …

金现代产品方案部部长王宁,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…

生产管理MES系统在卫浴企业中的应用

在卫浴企业的制造过程中&#xff0c;实现透明车间管理是一个旨在提升效率、质量和可视性的重要目标。MES系统可以在卫浴企业中帮助打造透明车间&#xff0c;提升生产管理的效率和可视性。具体能实现哪些管理呢&#xff1f; 实时监控生产状态&#xff1a; MES系统可以实时监控车…

【C#杂谈】在 .NET Framework 中使用新的C#语言特性

前排提示&#xff1a;提出一个可以让 [^1] 这中语法可以在.NET Framework运行时中使用的方法 众所都周知&#xff0c;.NET Framework&#xff08;以下简称 .NF&#xff09;作为一个被微软官方确认不在继续发布新特性的运行时&#xff0c;它所对应的C#语言版本被&#xff08;官方…

RabbitMQ架构详解

文章目录 概述架构详解核心组件虚拟主机&#xff08;Virtual Host&#xff09;RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件&#xff0c;支持多种协议和集群扩展。并且支持消息持久化和镜像队列&#xff0c;适用于对消息可靠性较高的场合 官网https://www.…

uniapp富文本编辑-editor-vue2-vue3-wangeditor

前言 除了“微信小程序”&#xff0c;其他小程序想要使用editor组件实现富文本编辑&#xff0c;很难vue3项目 官方组件editor&#xff0c;在初始化时有点麻烦&#xff0c;建议搭配第三方组件wangeditor 写在前面 - editor组件缺少editor-icon.css 内容另存为editor-icon.css…

Nginx反向代理详解

1. 什么是反向代理 反向代理是一种服务器代理的方式&#xff0c;它代理了客户端的请求并将请求转发给后端服务器&#xff0c;然后将后端服务器的响应返回给客户端。在这个过程中&#xff0c;客户端并不直接与后端服务器通信&#xff0c;而是通过反向代理服务器来实现请求转发和…

深入理解 Java 循环结构:while、do while、for 和 for-each 循环

Java 循环 循环可以执行一个代码块&#xff0c;只要达到指定的条件。循环很方便&#xff0c;因为它们节省时间&#xff0c;减少错误&#xff0c;并使代码更易读。 Java While 循环 while 循环会循环执行一个代码块&#xff0c;只要指定的条件为真&#xff1a; 语法 while …

整站下载保存为mhtml

整站下载保存为mhtml 代码 MHTML格式具有独特的优点&#xff0c;它可以完整保留原始网页的所有布局元素以及嵌入图片&#xff0c;无需外部依赖即可呈现原始网页内容&#xff0c;增强了可读性和便捷性。下文将展示如何运用自动化技术&#xff0c;从一个网站的首页出发&#xff0…

Spring Boot 部署在Windows

1、Spring Boot项目打成jar包。利用maven插件&#xff08;多模块项目只需在服务模块添加插件&#xff09; <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>…

服务器租用和托管的区别

目前对于服务器要求相对高的企业会希望使用独立服务器来运行自己的网站&#xff0c;而在选择独立服务器业务事&#xff0c;是使用服务器托管还是服务器租用这两种方法时&#xff0c;许多刚进入网络或者传统行业的从业者&#xff0c;都不太了解什么是服务器&#xff0c;现在我来…