首页 > 其他分享 >web前端tips:js继承——寄生组合式继承

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

时间:2023-11-30 19:02:52浏览次数:44  
标签:组合式 web 继承 js 寄生 原型 父类 构造函数

输入图片描述

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

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

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

寄生组合式继承

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

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

基本步骤:

  1. 创建一个中间对象,该对象的原型为父类的原型。
  2. 将中间对象的构造函数指向子类。
  3. 将子类的原型设置为中间对象。
  4. 进行调用继承。
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 语法来实现继承。

结语

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

标签:组合式,web,继承,js,寄生,原型,父类,构造函数
From: https://blog.51cto.com/u_15994752/8633489

相关文章

  • 如何在Spring Boot中不启动Web Server
    XYHS:用方法4,spring.main.web-application-type=none,实测可行如何在SpringBoot中不启动WebServer1.介绍SpringBoot是一个用于为各种应用快速创建新的Java应用程序的优秀框架。最流行的用途之一是作为web服务器。但是,SpringBoot有许多不需要web服务器的场景:控制台应用程序、作......
  • SpringBoot Resolved [org.springframework.web.multipart.support.MissingServletRe
    SpringBootResolved[org.springframework.web.multipart.support.MissingServletRequestPartException:Requiredrequestpart'file'isnotpresent]IDEA报错信息这个错误主要主要是指后端通过@RequestParam("file")注解标注的MultipartFile参数并没有获取到文件参数为n......
  • C#的HttpWebRequest发送form-data数据
    以下是使用C#中的HttpWebRequest发送post请求的示例代码,请求头为form-data,可以上传文件。你可以将它封装成一个通用的方法。1publicstaticstringHttpPost(stringurl,Dictionary<string,string>parameters,Dictionary<string,string>files)2{stringstrBou......
  • Web3.0 是00后最舒适的选择
    00后一代是社会变革的见证者和推动者,他们与前几代的差异显而易见。这一代年轻人在技术和信息方面长期接受教育,对新兴科技和互联网有着天然的亲近感。他们注重个性表达,崇尚自由,对数字化生活有着更为敏锐的嗅觉。这种独特的文化氛围为他们接纳Web3.0带来的变革提供了土壤。  W......
  • H50088:js动态生成html代码的三种形式
    1,//方案一O.TEMPLATE='<divclass="viewer-container">\<divclass="viewer-canvas"></div>\<divclass="viewer-footer">\<divclass="viewer-title&quo......
  • python的websockets库
    安装pipinstallwebsockets分为客户端和服务端两部分  服务端一般与异步的库一起用因为客户端不可能只服务一个客户所以要用异步处理多个客户 以asyncio示例 fromwebsockets.serverimportserveimportwebsocketsimportasyncioasyncdefstart(ws,path):#......
  • Jmeter接口自动化测试 —— Jmeter断言之Json断言
     json断言可以让我们很快的定位到响应数据中的某一字段,当然前提是响应数据是json格式的,所以如果响应数据为json格式的话,使用json断言还是相当方便的。还是以之前的接口举例Url:https://data.cma.cn/weatherGis/web/weather/weatherFcst/getCurrentConditionHTTPMethod:Po......
  • JS累加器
    假设您的数组如下:JavaScriptCode复制内容到剪贴板const array = [    { totalAmount: 100 },    { totalAmount: 200 },    { totalAmount: 300 },    { totalAmount: 150 }  ];   您可以使用Array.reduce()方法对每组totalAmount进行累......
  • WebRTC的QOS技术如何提升音视频通话质量
    摘要随着GPT-4的发布,AI的风越吹越旺。GPT-4可以回答问题,可以写作,甚至可以基于一张草图生成html代码搭建一个网站。即构社区的一位开发者@倪同学就基于目前在研究的WebRTCQOS技术点对GPT-3.5跟GPT-4进行一场实验,ChatGPT会取代程序员还是成为最强辅助?以下为@倪同学的博文。ChatGPT取......
  • 【开源】基于JavaWeb的固始鹅块销售系统
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的固始鹅块销售系统,包含了鹅块类型模块、固始鹅块模块、鹅块订单模块、评论管理模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,固始鹅块销售系统基于角色......