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.子构造函数继承父构造函数

        //写法1
        function 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 = motherObj
          return NewFun
       }
       //传递刘梅的对象,将刘梅的对象属性添加一个构造函数的原型的原型上,返回值是那个添加了刘梅属性的构造函数
       let Liuxing =  ParasitismFun(LiumeiPerson)
       console.log(Liuxing,'刘星构造函数')
       let liuxingPerson = new Liuxing('刘星')
       console.log(liuxingPerson,'刘星本人')
输出

 解释

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

class类继承

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

解释

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

补充

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ 三目运算符在类中的使用

简介 在类比较方面&#xff0c;三目运算符可以用于重载比较运算符。 代码示例1 #include <iostream> #include <cstring>class Person { public:Person(const char* name, int age) : m_age(age) {m_name new char[strlen(name) 1];strcpy(m_name, name);}~Pe…

LeetCode - 110. 平衡二叉树(C语言,二叉树,配图,简单)

根据题意&#xff0c;我们只需要比较当前节点的左右子树高度差是否小于1&#xff0c;利用分治法&#xff0c;只需要满足&#xff1a; 1. 根节点的左右子树的高度差小于1。 2. 根节点左右子树的满足高度差小于1&#xff0c;在往下走&#xff0c;判断左子树根节点的左右子树是否满…

软件设计之原型模式

原型模式是从一个对象再创建另一个可定制的对象&#xff0c;而且不需要知道任何创建的细节。拷贝分浅拷贝和深拷贝。浅拷贝无法拷贝引用对象。在面试的时候&#xff0c;我们会投多家公司&#xff0c;根据岗位的不同我们会适当调整。使用原型模式可以快速达到需求&#xff0c;下…

自动化测试的4大注意事项

自动化测试能够提高测试效率、覆盖率&#xff0c;降低测试成本和工作量&#xff0c;是软件开发中不可或缺的一部分。但前提是要确保自动化测试的有效性和可靠性&#xff0c;否则无效或错误的自动化测试&#xff0c;往往会对项目造成负面影响&#xff0c;如维护成本高、假阳性和…

JVM——内存溢出和内存泄漏

目录 1. 内存溢出和内存泄漏内存泄漏的常见场景解决内存溢出的思路1.发现问题 – Top命令2.发现问题 – VisualVM3.发现问题 – Arthas4.发现问题 – Prometheus Grafana5.发现问题 – 堆内存状况的对比![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/058d113715b…

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;1&#xff09;项目介绍及GUI界面基础 一、项目介绍 1.1方案提供 1.2主控选择 1.3硬件平台 1.4 开发环境 1.5 关于华清 二、GUI界面基础 2.1.1 嵌入式绘图系统 2.1.1 色彩格式 2.1.1帧缓冲区 …

蓝桥杯每日一题2023.12.4

题目描述 竞赛中心 - 蓝桥云课 (lanqiao.cn) 题目分析 本题使用树型DP&#xff0c;蓝桥杯官网出现了一个点的错误&#xff0c;但实际答案是正确的 状态表示&#xff1a;f[u]&#xff1a;在以u为根的子树中包含u的所有联通块的权值的最大值 假设s1&#xff0c;s2,…sk 是u的…

Python 网络爬虫(三):XPath 基础知识

《Python入门核心技术》专栏总目录・点这里 文章目录 1. XPath简介2. XPath语法2.1 选择节点2.2 路径分隔符2.3 谓语2.4 节点关系2.5 运算符 3. 节点3.1 元素节点&#xff08;Element Node&#xff09;3.2 属性节点&#xff08;Attribute Node&#xff09;3.3 文本节点&#xf…

深入理解Zookeeper系列-4.Watcher原理

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

华为云之一键安装宝塔面板

华为云之一键安装宝塔面板 一、本次实践介绍1.1 实践环境简介1.2 本次实践目的 二、宝塔面板介绍三、环境准备工作3.1 预置实验环境3.2 查看环境信息3.3 登录华为云3.4 查看弹性云服务器状态3.5 ssh登录弹性云服务器3.6 查看操作系统版本 四、安装宝塔面板4.1 一键部署宝塔面板…

备战春招——12.04 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_&#xff0c;完成映射操作&#xff0c;主要是相应的函数。map和set是有序的&#xff0c;使用的是树的形式&#xff0c;unordered_map和unordered_set使用的是散列比表的&#xff0c;无序。 相应函数…

[Android] c++ 通过 JNI 调用 JAVA函数

如何使用&#xff1a; Calling Java from C with JNI - CodeProject c里的 JNI 类型 和 JAVA 类型的映射关系&#xff1a; JNI Types and Data Structures Primitive Types and Native Equivalents Java TypeNative TypeDescriptionbooleanjbooleanunsigned 8 bitsbytejbyt…

Redis Desktop Manager for Mac:高效管理Redis数据的必备工具

Redis是一种快速、可扩展的内存数据库&#xff0c;被广泛应用于缓存、消息队列和实时分析等领域。而Redis Desktop Manager for Mac作为一款专为Mac用户设计的Redis桌面管理工具&#xff0c;为用户提供了高效便捷的方式来管理和操作Redis数据。 首先&#xff0c;Redis Desktop…

fastadmin权限树。树形下拉框

fastadmin 笔记 权限树 在构造方法中编写相应的代码 值得一提的是&#xff0c;你的表必须有 id 字段以及 pid 字段。 // 必须将结果集转换为数组$ruleList \think\Db::name("state_list")->field(createtime,updatetime, true)->order(id ASC)->select();…

【文末送书】Python OpenCV从入门到精通

文章目录 &#x1f354;简介opencv&#x1f339;内容简介&#x1f6f8;编辑推荐&#x1f384;导读&#x1f33a;彩蛋 &#x1f354;简介opencv OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;提供了丰富的图像处理和…

和田夜市,一个让人流连忘返的“深夜食堂”

11月26日晚&#xff0c;华灯初上&#xff0c;和田夜市热闹非凡&#xff0c;来自天南海北的游客汇聚于此&#xff0c;各种勾人味蕾的风味小吃&#xff0c;令人目不暇接。 和田夜市由来已久&#xff0c;晚上逛夜市已成为和田人的一种生活方式&#xff0c;因此这里也最能体现和田人…

webpack学习-1.起步

webpack学习-1.起步 1.基础设置2.配置文件的引入3.总结 1.基础设置 首先 webpack是干嘛的呢&#xff0c;用官网的一张图 Webpack 是一个现代的静态模块打包工具。它主要用于将前端应用程序中的各种资源&#xff08;例如 JavaScript、CSS、图片等&#xff09;打包成一个或多个…

【Axure高保真原型】3D大屏可视化模板

今天和大家分享3D大屏可视化的原型模板&#xff0c;里面包括3D条形图、3D柱状图、3D饼图、3D环形图、3D金字塔图&#xff0c;鼠标移入图表&#xff0c;对应区域会高亮变色&#xff0c;并且显示对应的数据标签&#xff0c;具体效果可以点击下方视频观看或打开下方预览地址查看哦…

Windows server 2019 域环境部署

环境准备 准备3台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xff0c;操作系统版本Windows Server 2019 Datacenter 域服务器&#xff1a;adc&#xff0c;192.168.56.120服务器1&#xff1a;server1:&#xff0c;192.168.56.121服务器2&#xff1a;server2&…

InsCode实践分享

在当今信息爆炸的时代&#xff0c;如何从海量信息中脱颖而出&#xff0c;获取更多的关注和认可&#xff0c;成为了许多人的共同追求。作为知乎平台上的优质用户&#xff0c;我愿意分享一些自己的经验和技巧&#xff0c;帮助大家更好地运用InsCode&#xff0c;实现个人成长和进步…