js中继承的方法

前言:

本人刚写了一篇原型链的封装继承多态,用家有儿女做的demo。其实我个人感觉封装和多态都容易去理解与实现。关键在于继承,js的才是比较难的,也容易让人混乱,至少我是因为继承头大过\(^o^)/~

js中有很多方法可以实现继承,这篇文章主要对继承的方法进行学习与测试。

这里插一句,个人习惯是展示代码,展示效果,完了去解释发生了什么。因为我感觉对于大部分人来说,光听理论还是不行,最重要的是让他们看到清晰的代码和输出流程,这样才能知道每一步都发生了什么,最后个人开始悟。我大部分文章都是这么写的,希望大家能理解我的思路

正文

原型链实现继承

代码
        //1.原型链继承//妈妈刘梅的构造函数function Liumei(){this.name = '刘梅'//方法1:定义时添加this.xuexing = 'o型血'}//方法2:定义完毕再添加// Liumei.prototype.xuexing = 'o型血'//儿子刘星的构造函数function Liuxing(){this.name = '刘星'}//刘星的原型对象继承刘梅,核心代码就是这句Liuxing.prototype = new Liumei()console.log(Liuxing,'继承后刘星的构造函数')console.log(Liuxing.prototype,'刘星的原型对象')let liuxingPerson = new Liuxing()console.log(liuxingPerson,'刘星本人')console.log(liuxingPerson.name,'刘星本人名字')console.log(liuxingPerson.xuexing,'刘星本人血型')
 输出

解释

 这里最关键的一步是将刘星构造函数的原型对象指向了刘梅的构造函数,这里就实现了继承,主要看那句输出  '刘星的原型对象'。

这里就要说到一个大家比较熟悉的例子了,vue2中的全局事件总线

new Vue({beforeCreate () {Vue.prototype.$bus = this  //这里就是用的这种继承方法},router,render: h => h(App)
}).$mount('#app')

子构造函数继承父构造函数

代码
        //2.子构造函数继承父构造函数//写法1function Liumei(){console.log(this,'这里的this在new刘星时,就是刘星实例对象')this.name = '刘梅'this.xuexing = 'o型'}function Liuxing(){Liumei.call(this)//这段代码要写在call方法后面,如果写在call方法前面,名字就会被覆盖掉。如果感觉不合适,可以让Liumei构造函数添加一个name参数,在call方法中加入刘星的名字this.name = '刘星'  }// //写法2// function Liumei(name = '刘梅'){//     this.name = name//     this.xuexing = 'o型'// }// function Liuxing(name){//     Liumei.call(this,name)// }let liuxingPerson = new Liuxing('刘星')console.log(liuxingPerson,'刘星本人')
输出

 解释

两种写法实现的效果相同,其实这里的代码很简单,很明白就看出哪一句是关键代码。多说一句,一定要很清楚this在各种情况下的指向,这对于你理解和读懂代码很关键

比如在这里,两个构造函数中,this就是实例对象,那么new Liuxing就是刘星本人这个对象,call再将刘梅的this指到刘星的实例对象,所以刘梅构造函数中定义的属性就会保存在刘星实例对象中。

 Object.create方法继承

代码
        //3.Object.create继承let LiumeiPerson = {name:'刘梅',xuexing:'o型'}let liuxingPerson = Object.create(LiumeiPerson)liuxingPerson.name = '刘星' console.log(liuxingPerson,'刘星本人')
输出

 解释

这个方法属于Object上的一个方法,创建了新的对象,把原有对象的属性添加到这个新对象上,具体可以去MDN上查看

寄生式的继承

代码
        //4.寄生式继承let LiumeiPerson = {name:'刘梅',xuexing:'o型'}function ParasitismFun(motherObj){//记住,箭头函数不能当构造函数function NewFun (name){this.name = name}NewFun.prototype = motherObjreturn NewFun}//传递刘梅的对象,将刘梅的对象属性添加一个构造函数的原型的原型上,返回值是那个添加了刘梅属性的构造函数let Liuxing =  ParasitismFun(LiumeiPerson)console.log(Liuxing,'刘星构造函数')let liuxingPerson = new Liuxing('刘星')console.log(liuxingPerson,'刘星本人')
输出

 解释

其实就是一个封装的构造函数,将刘梅的属性都添加到刘星构造函数的原型上,这样刘星构造函数在创建实例对象的时候,就能得到刘梅对象上的属性,完成了属性的继承。

class类继承

代码
    //5.class类继承class Liumei{constructor(name){this.name = namethis.xuexing = 'o型'}}class Liuxing extends Liumei{constructor(name){super(name)}}let liuxingPerson = new Liuxing('刘星')console.log(liuxingPerson,'刘星本人')
输出

解释

这个没什么好说的,es6中class的特性,不太熟悉class的人可以去查阮一峰es6,也可以去看我之前的那篇class类的使用,不是很难。

补充

主要就是这5种方法,总而言之,就是让一个对象得到另一个对象身上的属性。

在必要的情况下,也可以将原型链继承和构造函数继承,寄生式继承等配合使用。

框架的源码中很多都会用到继承,一定要好好弄得继承的意义和使用方式,对个人提升很有帮助。

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

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

相关文章

[STM32-1.点灯大师上线】

学习了江协科技的前4课,除了打开套件的第一秒是开心的,后面的时间都是在骂娘。因为51的基础已经几乎忘干净,c语言已经还给谭浩强,模电数电还有点底子,硬着头皮上吧。 本篇主要是讲述学习点灯的过程和疑惑解释。 1.工…

【3】密评-物理和环境安全测评

0x01 依据 GB/T 39786 -2021《信息安全技术 信息系统密码应用基本要求》针对等保三级系统要求: 物理和环境层面: a)宜采用密码技术进行物理访问身份鉴别,保证重要区域进入人员身份的真实性; b)宜采用密码技术保证电子门…

[HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

电音制作入门软件FL Studio21.2.0最新永久免费版

FL Studio是一款出色的编曲软件,最新版本的FL Studio21新增了四款全新的插件,覆盖了音频设计、延迟、相位器等等。通过软件的不断更新,我们可以享受到更加智能的电子音乐创作工具,目前,FL Studio的正式版已经推出了超过…

内核启动时间信息打印

文章目录 一 串口打印1 借助串口助手2 dmesg自带时间3 内核显示时间信息4 借助initcall_debug二 图形花显示1 bootgraph工具使用2 Bootchart工具使用3 Grabserial工具使用一 串口打印 1 借助串口助手 2 dmesg自带时间 root@xboard:~# dmesg [ 0.000000] Booting Linux on …

操作系统概论:揭秘计算机背后的神秘力量

操作系统概论 & 功能 概述定义操作系统功能作为系统资源的管理者向上层提供方便易用的服务作为最接近硬件的层次 主页传送门:📀 传送 概述 概念: 定义 控制和管理计算机硬件和软件资源的程序一种系统软件为上层用户、应用程序提供简单易…

uniapp开发小程序经验记录

uniapp开发小程序的过程中会遇到很多问题,这里记录一下相关工具优化,便于后来者参考。 每次保存代码后,小程序都跳回首页 针对这个问题,常规的做法就是修改pages配置文件,但是这种方式不便于路由参数的设置&#xff…

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …

【Wireshark工具使用】Wireshark无法抓取TwinCAT的EtherCAT包(已解决)

写在前面 因项目需要,近期在在深入研究EtherCAT协议,之后会将协议做一个系统的总结,分享在这个分栏。在研究EtherCAT协议帧时,使用了一个网络数据分析工具Wireshark,本文是关于EtherCAT数据帧分析工具使用中遇到的一个…

【设计模式】策略模式设计-电影票打折功能

任务二:使用策略模式设计电影票打折功能 某电影院售标系统为不同类型的用户提供了不同的打折方式(Discount),学生凭学生证可享受8折优惠**(StudentDiscount),儿童可享受减免10元的优惠&#xf…

「Verilog学习笔记」时钟分频(偶数)

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule even_div(input wire rst ,input wire clk_in,output wire clk_out2,output wire clk_out4,output wire clk_out8); //********…

新华三数字大赛复赛知识点 VLAN基本技术

VLAN IEEE 802.1Q 交换机端口类型 MVRP协议 VLAN Virtual LAN虚拟局域网。LAN可以是由几台少数家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络–也就是广播域。将一个物理的局域网在逻辑上划分成多个广播域…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上,让我们的web页面看起来像一个本地应用程序一样,通过桌面APP图标一打开,直接全屏展示,就像在APP中效果一样,完全体会不到你是在浏览器中。 1.网站添加样式 在…

时间复杂度为 O(n^2) 的排序算法 | 京东物流技术团队

对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n2) 的排序算法可能会比 O(nlogn) 的…

Stable Diffusion教程:4000字说清楚图生图

原文:Stable Diffusion教程:4000字说清楚图生图 - 知乎 目录 收起 基本使用 涂鸦绘制 局部绘制 局部绘制(涂鸦蒙版) 局部绘制(上传蒙版) 批量处理 总结 资源下载 “图生图”是 Stable Diffusion…

【Android知识笔记】架构专题(三)

如何用工程手段,提高写代码的生产力?(元编程) 即如何写同样多的代码,花费更少的时间?如何自动生成代码,哪种代码可以被自动生成?哪些环节能够作为自动生成代码的切入点? 代码自动生成技术 代码自动生成,指的并不是让计算机凭自己的意愿生成代码。而是让预先实现好…

windows运行orb-slam3遇到的问题

windows版代码地址:https://github.com/melhashash/orbslam3-windows 编译完成,出现初始化不成功的现象。 问题一: 相机参数中没有相机类型,导致畸变参数初始化失败。 GrabImageRGBD中frame对象实例化时,缺少相机参数…

【Windows】永久屏蔽系统更新

永久关闭电脑更新服务 操作思路: 第一步 winR 输入 services.msc 回车 进入服务管理窗口第二步 进入窗口后 找到 w 开头的文件夹 并找到Windows Update 双击打开 Windows Update 将启动类型(E) 改为禁用 上方的 “常规” “登录” “恢…

SNP推出新Glue软件Saas版本,助力云数据集成

最新Glue版本可作为软件即服务(SaaS)应用程序使用SAP数据和非SAP数据源之间的云原生集成大大简化了客户的企业数据集成SNP Glue通过应对AI和大数据计划中的关键挑战来增强云数据集成的价值 德国,海德堡 —— 2023年11月29日,作为SAP环境中数字化转型、自…