理解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()breakcase "playGame":playGame()breakdefault: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 - numreturn 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 = 1000000Family.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 - 100000console.log(XiaDongHai.car,XiaDongHai.bankBook,'夏东海')console.log(LiuMei.car,LiuMei.bankBook,'刘梅')

 

 结论

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

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

同甘共苦

多态

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

结论

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

龙生九子各不同

结束语

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

更多继承方法请看:

js中继承的方法-CSDN博客

感觉有用的给个赞吧!

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

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

相关文章

数据结构——希尔排序(详解)

呀哈喽,我是结衣 不知不觉,我们的数据结构之路已经来到了,排序这个新的领域,虽然你会说我们还学过冒泡排序。但是冒泡排序的性能不高,今天我们要学习的希尔排序可就比冒泡快的多了。 希尔排序 希尔排序的前身是插入排…

【C语言】指针与数组的潜在联系

目录 前言 改变固有数组的平面思维 注意: 数组操作与指针等价 指针数组 数组指针 笔试加深理解: 解析: 前言 《C Traps and Pitfalls》(C语言缺陷与陷阱)中有一句著名的见解: “在C语言中,指针与数组这两个概念…

【华为数据之道学习笔记】1-2华为数字化转型与数据治理

传统企业通过制造先进的机器来提升生产效率,但是未来,如何结构性地提升服务和运营效率,如何用更低的成本获取更好的产品,成了时代性的问题。数字化转型归根结底就是要解决企业的两大问题:成本和效率,并围绕…

linux基础五:linux 系统(进程状态+进程优先级+调度和切换+环境变量)

linux 系统 一.进程状态:1.睡眠状态(sleep):2.磁盘休眠状态(disk sleep):3.停止状态(stoped --- T):4.死亡状态:5.控制状态(t) 二.僵尸进程和孤儿进程:1.僵尸状态:2.孤儿…

天眼销:精准的企业名录

企业名录的重要性,对于销售而言都是极其重要的。本期为家人们分享如何正确挑选出优质的企业名录渠道,避免走一些弯弯坑坑。 为了有效利用企业名录进行客户开发,您需要关注信息的准确性、可提供的资源数量以及信息的时效性。能否根据您的需求…

山西电力市场日前价格预测【2023-12-05】

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-05)山西电力市场全天平均日前电价为118.23元/MWh。其中,最高日前电价为305.71元/MWh,预计出现在00:15。最低日前电价为0.00元/MWh,预计出…

MyBatis学习笔记

MyBatis中文网:https://mybatis.net.cn/ 1 什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBatis 可以通过简单的 XML 或…

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)

在日常人工智能演示中,比较常用的api展示方式如flask,gradio等Web调用方式。在本文中,详细描述了在编写flask api中语法及语音文本图像模版案例等~ Flask是微型的Python Web框架,如果模型本身就是用python语言构建的,那么利用FLa…

YOLOv3 快速上手:Windows 10上的训练环境搭建

文章目录 前言一、前期准备二、基础环境准备1. 创建虚拟环境2. 打开Terminal3. 下载YOLOv3运行环境 三、PyCharm关联3.1 运行PyCharm3.2 关联Anaconda虚拟环境 四、运行环境检查1. 检查requirements.txt文件2. 安装依赖 五、运行代码5.1 运行检测代码5.2 运行训练代码 六、常见…

虹科干货 | 关于JSON数据库

来源:艾特保IT 虹科干货 | 关于JSON数据库 原文链接:https://mp.weixin.qq.com/s/NutCGWa32rOcEHrk3UDGcQ 欢迎关注虹科,为您提供最新资讯! 如何理解JSON数据库?作为NoSQL数据库的一种类型,JSON数据库有哪…

罗技鼠标使用接收器和电脑重新配对

罗技鼠标使用接收器和电脑重新配对 文章目录 罗技鼠标使用接收器和电脑重新配对1\. 前言2\. 安装软件3\. 进行配对3.1. 取消之前的配对3.2. 重新配对3.3 配对完成 4\. 报错4.1. 重新配对时显示配对未成功 1. 前言 罗技的鼠标出厂的时候,默认的是将通道一设置为接收…

如何通过navicat连接SQL Server数据库

本文介绍如何通过Navicat 连接SQL Server数据库。如果想了解如何连接Oracle数据库,可以参考下边这篇文章。如何通过Navicat连接Oracle数据库https://sgknight.blog.csdn.net/article/details/132064235 1、新建SQL Server连接配置 打开Navicat软件,点击…

链表|2. 两数相加160. 相交链表 234. 回文链表

2. 两数相加 题目:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0…

极简模式,助力宏观数据监控

随着UWA GOT Online采样的参数越来越多样化,为了提升开发者的使用体验,我们最新推出了三种预设数据采集方案:极简模式、CPU模式、内存模式。该更新旨在降低多数据采集对数据准确性的干扰,同时也为大家提供更精准且有针对性的数据指…

解决使用Flipper无法连接到苹果模拟器,却能连接到安卓

而且这些都是显示正常 可是打开Virtual device一看ios一直在加载中 然后我打开日志看了下,然后各种找配置,项目里边配置改了又改,最后发现是缺少了个插件 //1、 检查 idb 和 idb_companion 是否已经安装 brew tap facebook/fb brew install …

Chart 3 Adreno OpenCL 应用程序开发

文章目录 前言4.1 Android上进行OpenCL应用程序开发4.2 Adreno OpenCL SDK 和 Adreno OpenCL 机器学习 SDK4.3 调试工具和技巧 前言 本章主要介绍如何 debug Adreno OpenCL应用程序 4.1 Android上进行OpenCL应用程序开发 Adreno GPU 主要在 Android 操作系统和部分 Linux 系统…

二叉树刷题Leetcode

文章目录 104.二叉树的最大深度100.相同的树965.单值二叉树 104.二叉树的最大深度 int maxDepth(struct TreeNode* root) {if(rootNULL)return 0; int left1maxDepth(root->left); int right1maxDepth(root->right); return left>right?left:right; }处理二叉树最大深…

感觉到自己思想扭曲了

突然觉得自己思想有点扭曲。 ​起因是近期备婚,需要给男方家人买衣服。问男朋友妹妹衣服预算多少,说是500内,然后想想自己这个新娘子,那一身衣服绞尽脑汁凑满减不到300。再联想到装饰新房,新房买家具,为了省…

TikTok与社会责任:平台如何推动正能量?

近年来,TikTok作为一款备受欢迎的社交媒体平台,不仅令人们畅享创意短视频,更在推动社会正能量方面发挥了积极作用。 本文将深入探讨TikTok在社会责任方面的表现,探究其是如何通过不同的举措推动正向影响,引领社会向更…

23史上最全版---SQL注入详解

漏洞原因 一些概念: SQL:用于数据库中的标准数据查询语言。 web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。 而数据库就是存储资源的地方。 而服务器获取数据的方法就是使用SQL语句进…