web前端tips:js继承——寄生组合式继承

news/2024/7/19 14:24:31 标签: javascript, 前端, js继承, js, 寄生组合式继承

输入图片描述

上篇文章给大家分享了 js继承>js继承中的 寄生式继承

web前端tips:js继承>js继承——寄生式继承

今天给大家分享一下 js 继承中的 寄生组合式继承

寄生组合式继承

寄生组合式继承是一种结合了寄生式继承组合式继承的方式,它的目标是减少组合式继承中多余的调用父类构造函数的开销。在组合式继承中,我们通过调用父类构造函数两次来实现属性的继承,但这样做可能会导致一些性能上的问题。

寄生组合式继承通过创建一个中间对象来继承父类的原型,从而避免了调用父类构造函数两次。以下是寄生组合式继承的实现方式:

基本步骤:

  1. 创建一个中间对象,该对象的原型为父类的原型。
  2. 将中间对象的构造函数指向子类。
  3. 将子类的原型设置为中间对象。
  4. 进行调用继承。
js">function inheritPrototype(child, parent) {
  // 创建一个中间对象,该对象的原型为父类的原型
  var prototype = Object.create(parent.prototype);
  // 将中间对象的构造函数指向子类
  prototype.constructor = child;
  // 将子类的原型设置为中间对象
  child.prototype = prototype;
}

function Parent(name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.sayName = function() {
  console.log(this.name);
};

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

inheritPrototype(Child, Parent);

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.sayName(); // 输出 "Tom"

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

通过这种方式,子类就能够继承父类的原型链上的属性和方法,而不需要调用两次父类构造函数。这种方式避免了组合继承中的性能问题,使得继承更加高效。

优点

  • 避免调用父类构造函数两次: 与组合式继承相比,寄生组合式继承通过创建一个中间对象,避免了调用父类构造函数两次的问题,从而提高了性能。
  • 原型链继承父类的方法和属性: 寄生组合式继承继承了父类原型链上的方法和属性,使子类实例能够访问到父类原型链上定义的方法,同时又避免了组合式继承中的一些问题。

缺点

  • 仍然有原型链上的引用类型问题: 如果父类原型链上有引用类型的属性,这些属性仍然会在子类实例之间共享,需要额外的注意以避免意外的修改。
  • ES5 之前的兼容性: 使用 Object.create 方法可能会导致在一些不支持 ES5 的环境中出现兼容性问题。在这种情况下,可能需要使用其他方法来创建对象,或者进行兼容性处理。
  • 对性能的依赖: 虽然寄生组合式继承相对于组合式继承有性能上的优势,但在大规模的应用中,仍然可能需要额外的性能优化或者考虑其他的继承方式。

总体来说,寄生组合式继承是一种在继承中相对合理的选择,特别是在要求继承父类原型链上方法和避免组合式继承性能问题的情况下。在实际应用中,选择继承方式时需要根据具体情况进行权衡和取舍。如果在现代环境下,可以考虑使用 ES6 的 class 语法来实现继承。

结语

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


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

相关文章

2023认证杯A题:太阳黑子预测|数学中国数学建模国际赛(小美赛) |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看认证杯的A题! 完整内容可以在文章末尾…

Python自动化办公:PDF文件的分割与合并

我们平时办公中,可能需要对pdf进行合并或者分割,但奈何没有可以白嫖的工具,此时python就是一个万能工具库。 其中PyPDF2是一个用于处理PDF文件的Python库,它提供了分割和合并PDF文件的功能。 在本篇博客中,我们将详细…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概3000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

易石无代码开发:电商平台连接CRM与客服系统,实现营销自动化

易石无代码开发的优势 易石软件以其强大的无代码开发平台,为电商企业提供了一种全新的业务集成手段。在激烈的市场竞争中,电商平台必须不断优化其运营效率和客户服务质量。易石无需复杂的API开发,通过简单的配置就能实现电商平台与CRM、客服…

产品学习之路(一)

在做好开发的同时,还需要熟悉产品业务逻辑,不能为了功能而做功能,要从产品经理的角度去看待每个需求和客户痛点所在,这样针对产品设计出来的东西自己也有发言权; 目前作为一名前端开发人员,也在自学产品知识…

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日,第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕,本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会(筹)主办&#xff0c…

冒泡排序(适合编程新手的体质)

冒泡排序:简单而高效的排序技巧 欢迎来到我们今天的博客,我们将一起探索计算机科学中最基本但同时也非常重要的概念之一:冒泡排序。无论你是编程新手还是有一些编程经验的读者,这篇博客都将帮助你更好地理解冒泡排序的原理和应用…

Kubernetes v1.28.4 安装笔记

安装 kubelet kubeadm kubectl K8s 集群的每个 node 上都要安装的 官方文档参考: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl 配置 containerd (容器运…