理解js中原型链的封装继承多态

前言

面向对象有三大特性:封装继承多态。

不过,js和java的封装继承多态是不一样的,我和从事java开发的朋友有过一次对话(抬杠 !--)。

我说:javascript也是面向对象语言,

他说:不对吧,js不是面向对象吧。

我说:是的,官方说的就是面向对象语言。

他说:那你知道三大特性吗?

我说:封装继承多态。

然后他说:那你说一下那都是啥意思。

我说:构造函数...原型对象...原型链....

他说:你说的这都是啥呀,构造函数和原型链是啥,听都没听过,面向对象使用类,你那js是假的面向对象吧。

我说:js后面用的是类,但在类之前用的是原型链。其实,类也是原型链的语法糖,不归根到底还是原型链吗。

因为我不懂java,他不懂js。不过js确实和java在面向对象的实现上是不一致的,js在class出来之前,是通过原型链的特性实现了面向对象编程。

家有儿女

今天这篇文章,我用《家有儿女》来通俗的说一下js中原型链是怎么完成封装继承多态的,class相关的这篇文章不提。

构造函数构建家庭成员

        function Family(name, gender, token) {
            //姓名
            this.name = name
            //性别
            this.gender = gender
            //身份
            this.token = token
            //家里有好多本书
            this.bookList = ['资治通鉴', '百家菜谱', '七龙珠', '三体']
            //家里的厨房可以用来做饭
            this.useChuFang = function (type, name) {
                console.log(`我用${type}做出了我想吃的${name}`)
            }
            //使用电脑
            this.computer = function (type) {
                //电脑有显卡,键盘,内存条,处理器等
                let xianka = () => { }
                let jianpan = () => { }
                let chuliqi = () => { }
                let write = () => {
                    console.log(`我是${this.name},我会用电脑写小说`)
                }
                let playGame = () => {
                    console.log(`我是${this.name},我会用电脑打游戏`)
                }
                switch (type) {
                    case "write":
                        write()
                        break
                    case "playGame":
                        playGame()
                        break
                    default:
                        console.log(`我是${this.name}抱歉,我不懂电脑的构造和具体原理`)
                }
            }
            //使用化妆品
            this.useHuaZhuangPin = function(){
                if (this.gender === 'woman') {
                    console.log(this.name,'你是女性,可以使用这些化妆品')
                } else {
                    console.log(this.name,'男人就别作妖了')
                }
            }
            //私有变量,10瓶饮料
            drinks = 10
            //闭包返回函数
            let fn = (num,name, drinks) => {
                if(drinks>-1){
                    console.log(`我是${name},我拿了${num}瓶饮料,还剩${drinks}瓶饮料`)
                }else{
                    console.log(`我是${name},我想拿饮料,发现没了`)
                }
                
            }
            //闭包封装私有变量,家里的饮料
            this.drinkFun = (num,name) => {
                drinks = drinks - num
                return fn(num,name, drinks)
            }
                        //家庭有一笔1百万的存折
                         bankBook = 1000000
        }



        let XiaDongHai = new Family('夏东海', 'man', '父亲')
        let XiaoXue = new Family('小雪', 'woman', '女儿')
        let LiuMei = new Family('刘梅', 'woman', '母亲')
        let LiuXing = new Family('流星', 'man', '儿子')
        console.log(XiaDongHai, '夏东海')
        console.log(XiaoXue, '小雪')
        console.log(LiuMei, '刘梅')
        console.log(LiuXing, '流星')
测试

结论:

一个构造函数就像是一个家庭,这个家庭有一些资产,是大家所共有的,每个家庭成员都可以去使用和调配这些资产,每个家庭成员都有原型链定义的方法属性和自己独有的属性。

封装

        //1.构造函数封装公共方法
        //夏东海用电脑写文章
        XiaDongHai.computer('write')
        //流星用电脑打游戏
        LiuXing.computer('playGame')
        //你问他们电脑的显卡原理是什么
        XiaDongHai.computer('xiaka')
        //他们虽然不懂电脑是怎么运行的,但是他们可以用电脑做到自己想做的事。

        //2.闭包封装私有变量
        //全家喝饮料
        XiaDongHai.drinkFun(3,'夏东海')
        LiuMei.drinkFun(2,'刘梅')
        LiuXing.drinkFun(4,'流星')
        XiaoXue.drinkFun(1,'小雪')
        XiaDongHai.drinkFun(1,'夏东海')
测试

 结论

构造函数内部可以封装公共属性方法,闭包可以封装私有变量,都可以让所有的实例对象去操作这些属性方法,并且无需知道这些属性方法是内部是如何构造的。

公共资产只要你是这个家庭成员,你就可以用它。你可以不用知道这个东西的构造原理是什么,你只需要会使用它。

你不需要会包饺子,你只需要会吃饺子

继承

        
        //给构造函数,也就是全家添加100万元的家庭资产和一辆奔驰轿车
        Family.prototype.bankBook = 1000000
        Family.prototype.car = '奔驰'

        //接下来我就用代码来清晰的展示面向对象的这些特征
        //构建家庭成员,其实构造函数的本质作用,就是用来批量创建一些拥有相同属性或者方法的对象,不让代 
        码大量冗余重复。
        let XiaDongHai = new Family('夏东海', 'man', '父亲')
        let XiaoXue = new Family('小雪', 'woman', '女儿')
        let LiuMei = new Family('刘梅', 'woman', '母亲')
        let LiuXing = new Family('流星', 'man', '儿子')

 测试
      
        //夏东海将原来的奔驰车卖掉了,换了一辆新宝马车,花了10万元
        Family.prototype.car = '宝马'
        console.log(Family.prototype.bankBook,'???')
        Family.prototype.bankBook = Family.prototype.bankBook - 100000
  
        console.log(XiaDongHai.car,XiaDongHai.bankBook,'夏东海')
        console.log(LiuMei.car,LiuMei.bankBook,'刘梅')

 

 结论

  原型链可以添加,重写一些公共属性,所有实例对象继承原型对象的属性都会受到影响。

  夏东海花了家里的公共财产,所有家庭成员拥有的共同财产就会减少。但是买了新车,以后所有成员就都能坐上宝马新车了。

同甘共苦

多态

        //夏东海和刘梅做饭
        LiuMei.useChuFang('鸡块','大盘鸡')
        XiaDongHai.useChuFang('方便面','泡面')
        //流星和小雪化妆
        LiuXing.useHuaZhuangPin()
        XiaoXue.useHuaZhuangPin()
测试

结论

不同的方法被不同的对象调用,结果会多样性。

龙生九子各不同

结束语

其实我说的也不是很详尽,只是想变着法的想让看客明白原型链的具体作用和实际运用方法,熟练理解原型链是js开发者最重要的技能之一,现在你可以想一下vue是不是也是使用原型链的特性去让各组件操作原型上的实例方法呢。

更多继承方法请看:

js中继承的方法-CSDN博客

感觉有用的给个赞吧!

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

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

相关文章

JSP 设置静态文件资源访问路径

这里 我们先在 WEB目录webapp 下创建一个包 叫 static 就用它来存静态资源 然后 我们扔一张图片进去 我们直接这样写 如下图 找到父级目录 然后寻找下面的 static 下的 img.png 运行代码 很明显 它没有找到 这边 我们直接找到 webapp目录下的 WEB-INF目录下的 web.xml 加入…

vue项目中添加刷新的按钮

刷新功能 点击导航的刷新按钮,刷新下方主体内容,我这边的项目分为左-上-下结构,上边为tabbar组件,下边为main组件,点击刷新整个流程是刷新按钮,去访问它父组件tabbar的兄弟组件main,使main组件…

MySQL EXPLAIN详解

MySQL数据库是许多Web应用程序的底层支持,而查询性能的优化是确保系统高效运行的关键。在MySQL中,EXPLAIN是一项强大的工具,可帮助开发者深入了解查询语句的执行计划,从而更好地优化查询性能。本文将详细解析MySQL的EXPLAIN关键字…

空间金字塔池化(SPP,Spatial Pyramid Pooling)系列

空间金字塔池化的作用是解决输入图片大小不一造成的缺陷,同时在目标识别中增加了精度。空间金字塔池化可以使得任意大小的特征图都能够转换成固定大小的特征向量,下面针对一些典型的空间金字塔进行盘点。 部分图片来自blog:空间金字塔池化改进 SPP / SP…

【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南(内存模型技术专题)

深入探索Java特性中并发编程体系的原理和实战开发指南( 线程进阶技术专题) 前言介绍JVM内存模型运行时数据区域堆内存栈内存 内存访问规则原子性对象类型基本类型 可见性有序性(Happen Before法则)系统内存(MESI协议&a…

群体遗传 — 核苷酸多样性π

群体遗传 — 核苷酸多样性π **核苷酸多样性(nucleotide diversity),记为π,是分子遗传学中一个重要的概念,用于量化种群内部或不同种群间的遗传多样性。**这一概念由根井正利和李文雄在 1979 年提出。核苷酸多样性的…

mysql原理--InnoDB记录结构

1.InnoDB行格式 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行…

随时随地查看远程试验数据与记录——IPEhub2与IPEmotion APP

一 背景 在工况恶劣、空间狭小的试验场景或工程机械领域中,不但试验人员在试验环境中对自身安全没有保障,而且试验过程也会受到影响,如高温高压测试、工程机械液压系统测试等。对此,结合IPEhub2与IPEmotion APP,既可保…

「GitHub资源」DevToys开发者神器,堪称程序员界的瑞士军刀!

如果你是一个 Windows 开发者,你是否经常需要在网上搜索一些工具来完成一些简单的任务,比如格式化 JSON,比较文本,测试正则表达式,转换数据类型,生成二维码,编码解码字符串等等?你是…

无脑018——win11部署whisper,语音转文字

1.conda创建环境 conda create -n whisper python3.9 conda activate whisper安装pytorch pip install torch1.8.1cu101 torchvision0.9.1cu101 torchaudio0.8.1 -f https://download.pytorch.org/whl/torch_stable.html安装whisper pip install -U openai-whisper2.准备模型…

Mysql索引案例分析

这篇文章写个案例,测试一下MySQL索引机制 测试表结构 CREATE TABLE t_qrcode_op (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,op_mobile varchar(16) NOT NULL,pr_code char(10) NOT NULL,PRIMARY KEY (id),UNIQUE KEY om_pc (op_mobile,pr_code) USING BTR…

SSH原理与应用与瞎玩

Secure Shell(SSH 安全外壳协议) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通…

前后端分离vue+Nodejs社区志愿者招募管理系统

1、首页 1)滑动的社区照片册 使用轮播图,对社区的活动纪念与实时事件宣传。 每个图片附有文字链接,点击跳转对应社区要闻具体页。 2)社区公告栏 日常的社区公告以及系统说明在此区域中进行说明与展示。 2、志愿活动 1)志愿活动发布 想发布需要登录 2)志愿…

html和css写QQ会员页面导航

目录 1、css代码 2、html代码 效果图 1、css代码 <style>* {padding: 0;margin: 0;list-style: none;text-decoration: none;}div {margin: 30px auto;}li {float: left;height: 60px;background-color: rgb(102, 102, 102);line-height: 40px;}img {height: 100%;ma…

Hadoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

索尼PMW580视频帧EC碎片重组开启方法

索尼PMW580视频帧EC碎片重组开启方法 索尼PMW-580摄像机生成的MXF文件存在严重的碎片化&#xff0c;目前CHS零壹视频恢复程序MXF版、专业版、高级版已经支持重组结构体正常的碎片&#xff0c;同时也支持对于结构体破坏或者覆盖后仅存在音视频帧EC数据的重组&#xff0c;需要注…

论文阅读:一种通过降低噪声和增强判别信息实现细粒度分类的视觉转换器

论文标题&#xff1a; A vision transformer for fine-grained classification by reducing noise and enhancing discriminative information 翻译&#xff1a; 一种通过降低噪声和增强判别信息实现细粒度分类的视觉转换器 摘要 最近&#xff0c;已经提出了几种基于Vision T…

【数据结构—单链表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 链表的概念及结构 2. 单链表的实现 2.1单链表头文件——功能函数的定义 2.2单链表源文件——功能函数的实现 2.3 单链表源文件——功能的测试 3.具体的理解操作…

ES-环境安装(elasticsearch:7.17.9,kibana,elasticsearch-head)

ES 环境搭建 1 拉取镜像 常用三件套 docker pull kibana:7.17.9 docker pull elasticsearch:7.17.9 docker pull mobz/elasticsearch-head:52 启动镜像 elasticsearch 安装 这里可以先不挂载文件启动一波&#xff0c;然后把容器里的文件拷贝出来 docker run -p 19200:9200 …

【Linux系统编程】开发工具yum和vim

目录 一&#xff0c;yum工具的使用 1&#xff0c;yum的介绍 2&#xff0c;yum的使用 二&#xff0c;vim工具的开发 1&#xff0c;vim的介绍 2&#xff0c;模式的使用 3&#xff0c;vim配置文件 4&#xff0c;sudo配置文件 一&#xff0c;yum工具的使用 1&#xff0c;y…