JavaScript继承的方法和优缺点

news/2024/5/19 13:21:04

原型链继承

让一个构造函数的原型是另一个类型的实例,那么这个构造函数new出来的实例就具有该实例的属性。

优点:

写法方便简洁,容易理解。

缺点:

在父类型构造函数中定义的引用类型值的实例属性,会在子类型原型上变成原型属性被所有子类型实例所共享。同时在创建子类型的实例时,不能向超类型的构造函数中传递参数。

代码

// 原型链继承
function Parent() {this.parentPrototype = "父级原型"this.parentObj = {info: "父级引用属性值info"}
}
function child() { }
child.prototype = new Parent();
const a = new child()
console.log(a.parentPrototype)
const b = new child()
a.parentObj.info = "a里面的"
console.log(b.parentObj.info)

结果

借用构造函数继承

在子类型构造函数的内部调用父类型构造函数;使用 apply() 或 call() 方法将父对象的构造函数绑定在子对象上。

优点:

解决了原型链实现继承的不能传参的问题和父类的原型共享的问题。

缺点:

借用构造函数的缺点是方法都在构造函数中定义,因此无法实现函数复用。在父类型的原型中定义的方法,对子类型而言也是不可见的,结果所有类型都只能使用构造函数模式。

代码

function Parent(name) {this.name = name;
}function Child(name, age) {Parent.call(this, name); // 使用call将Parent构造函数绑定到Child上this.age = age;
}let child = new Child('Parent', 25);
console.log(child.name); // 输出 'Parent'

结果

组合继承:原型链 + 构造函数 

将原型链和借用构造函数的组合到一块。使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有自己的属性。

优点:

解决了原型链继承和借用构造函数继承造成的影响。

缺点:

无论在什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。

代码

function Parent(name) {this.name = name;
}Parent.prototype.getName = function() {return this.name;
};function Child(name, age) {Parent.call(this, name); // 构造函数继承this.age = age;
}Child.prototype = new Parent(); // 原型链继承let child = new Child('Parent', 25);
console.log(child.getName()); // 输出 'Parent'

结果

原型式继承

         在一个函数A内部创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例。本质上,函数A是对传入的对象执行了一次浅复制。ECMAScript 5通过增加Object.create()方法将原型式继承的概念规范化了。这个方法接收两个参数:作为新对象原型的对象,以及给新对象定义额外属性的对象(第二个可选)。在只有一个参数时,Object.create()与这里的函数方法效果相同。

优点:

不需要单独创建构造函数。

缺点:

属性中包含的引用值始终会在相关对象间共享。

代码

function object(o) {function F() {}F.prototype = o;return new F();
}let parent = {name: 'Parent',getName: function() {return this.name;}
};let child = object(parent);
console.log(child.getName()); // 输出 'Parent'

结果

寄生式继承

寄生式继承背后的思路类似于寄生构造函数和工厂模式:创建一个实现继承的函数,以某种方式增强对象,然后返回这个对象。

优点:

写法简单,不需要单独创建构造函数。

缺点:

通过寄生式继承给对象添加函数会导致函数难以重用。

代码

function createAnother(original) {let clone = object(original);clone.sayHi = function() {return 'Hi';};return clone;
}let parent = {name: 'Parent',getName: function() {return this.name;}
};let child = createAnother(parent);
console.log(child.sayHi()); // 输出 'Hi'

结果

寄生组合式继承 (寄生+组合(原型链+借用构造函数))

通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。

优点:

高效率只调用一次父构造函数,并且因此避免了在子原型上面创建不必要,多余的属性。与此同时,原型链还能保持不变。

缺点:

代码复杂。

代码

function inheritPrototype(subType, superType) {let prototype = Object.create(superType.prototype);prototype.constructor = subType;subType.prototype = prototype;
}function Parent(name) {this.name = name;
}Parent.prototype.sayName = function () {console.log(this.name);
}function Child(name) {Parent.call(this, name);
}inheritPrototype(Child, Parent);let child1 = new Child('child1');
console.log(child1)

结果


http://www.mrgr.cn/p/16206476

相关文章

Nftables漏洞原理分析(CVE-2022-32250)

在nftales中存在着集合(sets),用于存储唯一值的集合。sets 提供了高效地检查一个元素是否存在于集合中的机制,它可以用于各种网络过滤和转发规则。而CVE-2022-32250漏洞则是由于nftables在处理set时存在uaf的漏洞。前言 在nftales中存在着集合(sets),用于存储唯一值的集合。…

YOLO-World环境搭建推理测试

一、引子 CV做了这么多年,大多是在固定的数据集上训练,微调,测试。突然想起来一句话,I have a dream!就是能不能不用再固定训练集上捣腾,也就是所谓的开放词汇目标检测(OVD)。偶尔翻翻AI新闻,发现现在CV领域有在卷开集目标检测的趋势。刚好翻到,YOLO-World这一开源项…

C++深度解析教程笔记6-const常量引用数组

C深度解析教程笔记6 第12课 - const常量&引用数组实验-const常量的判别实验-引用作为数组元素小结 本文学习自狄泰软件学院 唐佐林老师的 C深度解析教程,图片全部来源于课程PPT,仅用于个人学习记录 第12课 - const常量&引用数组 实验-const常量的…

C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解

目录 前言 一、原码、反码、补码 二、移位操作符 三、位操作符&#xff1a;&、|、^、~ 四、经典例题分析&#xff1a; 总结 前言 本文将详细介绍C语言中左移操作符<<&#xff0c;右移操作符>>&#xff0c;按位与&&#xff0c;按位或|&#xff0c;按位异或^…

如何查找Lenovo XClarity Controller 的 MIB 文件

描述 本文介绍了为运行Lenovo XClarity Controller (LXCC) 的Lenovo服务器查找和下载 MIB 文件的过程。 程序转至数据中心支持。 lenovo .com 。 在搜索栏中,输入Lenovo服务器型号名称,然后单击自动搜索结果中正确服务器下的“下载” 。注意:在此示例中,将使用 SR650。 在“…

直播话术核心逻辑,学了轻松提高销量!沈阳直播运营培训

直播话术到底该怎么说&#xff1f; 产品话术说得好&#xff0c;直播间一次就能卖出去上万件产品&#xff1b;产品话术说不好&#xff0c;直播间半个月也卖不出去10件产品。 我们上次就有跟大家说过产品话术的具体流程&#xff0c;但发现还有更多朋友居然还是不能够很好地完成一…

allure功能使用-添加链接linktestcaseissue

1.执行指定测试用例时,在测试方法前添加注解@allure.link跳转到执行地址: 在HTML报告可看到跳转信息: 2.执行指定测试用例时,需要知道测试案例所在代码仓库地址时,在其方法前添加注解@allure.testcase跳转仓库地址(用于代码走读): 3.执行指定测试用例时,需要将该用例…

云原生周刊:Terraform 1.8 发布 | 2024.5.6

开源项目推荐 xlskubectl 用于控制 Kubernetes 集群的电子表格。xlskubectl 将 Google Spreadsheet 与 Kubernetes 集成。你可以通过用于跟踪费用的同一电子表格来管理集群。git-sync git-sync 是一个简单的命令,它将 git 存储库拉入本地目录,等待一段时间,然后重复。当远程…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

关于Docker的数据管理

文章目录 一、Docker的数据管理1、数据卷1.1 数据卷定义1.2 数据卷配置 2、数据卷容器2.1 创建数据卷容器2.2 使用--volume-from来挂载luck02 二、端口映射三、容器互联1、创建容器互联2、进入luck02测试&#xff08;ping 容器名/别名&#xff09; 四、Docker镜像的创建1、基于…

二叉树进阶:二叉搜索树、平衡二叉树、KD树(实现KNN算法的快速寻找k个邻居)

二叉搜索树二叉搜索树又称为二叉排序树、二叉查找树。请记住,本篇所介绍的所有树,都是二叉搜索树,也就是说都用到了二分查找的思想。二叉搜索树的特征:每个结点的左结点都小于结点本身,右结点都大于结点本身。用中序遍历来遍历一棵二叉搜索树,结果必然是有序的。 时间复杂…

岩土工程监测中振弦采集仪的布设方案及实施步骤简析

岩土工程监测中振弦采集仪的布设方案及实施步骤简析 岩土工程监测中,河北稳控科技振弦采集仪是一种常用的地下水位和土层压缩性监测工具。它通过采集振弦的振动信号来确定地下水位和土层的压缩性,为岩土工程的设计、施工和监测提供重要的数据支持。下面将对振弦采集仪的布设方…

活动回放 | 如何进行全增量一体的异构数据库实时同步

如何在不影响并保持现有业务系统正常运转的前提下,实现数据向新业务系统的持续同步,并保障异构数据同步的完整性、准确性、一致性、时效性。以 AI 领域为代表的新技术不断涌现,新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐,越来越多的企业开始着手,对仍以传统关系…

使用XPTable控件展示多窗口数据(XPTable控件使用说明七)

我给我的应用程序找到一个新的能力&#xff0c;因为有DEMO程序界面有6个窗口&#xff0c;我使用了2个显示器&#xff0c;一起来显示。

(前++) 和 (后++)的练习题

打印也是一种运算,因此是先打印出5,再-1。每天进步一点点,快乐生活多一点。

编程入门(六)【Linux系统基础操作一】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;Linux操作系统介绍与环境准备Linux操作系统介…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS&#xff08;Linux Virtual Server&#xff09;的网络地址转换&#xff08;NAT&#xff09;模式是一种在网络层&#xff08;第四层&#xff09;实现负载均衡的方法。在NAT模式中&#xff0c;Director Server&#xff08;DS&#xff09;充当所有服务…

11.IO 流

1.IO 流引入 概述:以应用程序为参照物,读取数据为输入流(Input),写数据为输出流(Output),大量输入输出数据简称 IO 流 原理:2.IO 流的分类 读写的文件分类二进制文件:打开后是乱码,或者是 16 进制,无法生成文件的文件 文本文件:打开文件内容可以直接阅读IO流读取数…

人大金仓数据库使(cai)用(keng)记录

最近一直在用人大金仓做项目,相关的文档相比其它流行的所谓“主流”数据库来说还是少了点,记录一些开发过程中遇到的问题。 1.数据库的模式(database_mode)在实例创建后就确定好了的,不可更改。想要改变模式只能重新init一个实例。oracle 模式下,实例目录下kingbase.conf…