【JS】Chapter14-深入面向对象
站在巨人的肩膀上
黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程
(十四)深入面向对象
1. 编程思想
1.1 面向过程介绍
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。
- 面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。
1.2 面向对象介绍
- 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。
- 面向对象是以对象功能来划分问题,而不是步骤。
- 在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工。
- 面向对象编程具有灵活、代码可复用、容易维护和开发的优点,更适合多人合作的大型软件项目。
- 面向对象的特性:
- 封装性
- 继承性
- 多态性
1.3 面向过程和面向对象的对比
- 面向过程编程:
- 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。
- 缺点:没有面向对象易维护、易复用、易扩展
- 面向对象编程:
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
- 缺点:性能比面向过程低
2. 构造函数
- 封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装。
- 同样的将变量和函数组合到了一起并能通过 this 实现数据的共享,所不同的是借助构造函数创建出来的实例对象之间是彼此不影响的
- 总结:
- 构造函数体现了面向对象的封装特性
- 构造函数实例创建的对象彼此独立、互不影响
- 封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装。
- 面向对象编程的特性:比如封装性、继承性等,可以借助于构造函数来实现
- 前面我们学过的构造函数方法很好用,但是存在浪费内存的问题:
function Star(uname, age) {this.uname = uname;this.age = age;this.sing = function() {console.log('我会唱歌');} } const ldh = new Star('刘德华', 18) const zxy = new Star('张学友', 19) console.log(ldh.sing === zxy.sing) // 结果为 false,说明俩函数不一样- 我们希望所有的对象使用同一个函数,这样就比较节省内存,那么我们要怎样做呢?
3. 原型
3.1 原型
- 构造函数通过原型分配的函数是所有对象所共享的。
- JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象
- 这个对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存
- 我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法。
- 构造函数和原型对象中的 this 都指向实例化的对象。
- 例子:
function Star(uname, age) {this.uname = uname;this.age = age; } console.log(Star.prototype) // 返回一个对象称为原型对象 Star.prototype.sing = function() {console.log('我会唱歌'); } const ldh = new Star('刘德华', 18) const zxy = new Star('张学友', 19) console.log(ldh.sing === zxy.sing) // 结果为 true,说明俩函数一样,共享
3.2 constructor 属性
- 每个原型对象里面都有个 constructor 属性(constructor 构造函数)
- 作用:该属性指向该原型对象的构造函数。
- 使用场景:
- 如果有多个对象的方法,我们可以给原型对象采取对象形式赋值.
- 但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象 constructor 就不再指向当前构造函数了
- 此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数。
- 例子:
function Star(name) {this.name = name } Star.prototype = {sing: function() { console.log('唱歌') },dance: function() { console.log('跳舞') } } console.log(Star.prototype.constructor) // 指向 Objectfunction Star(name) {this.name = name } Star.prototype = {// 手动利用 constructor 指回 Star 构造函数constructor: Star,sing: function() { console.log('唱歌') },dance: function() { console.log('跳舞') } } console.log(Star.prototype.constructor) // 指向 Star
3.3 对象原型
- 对象都会有一个属性 __proto__指向构造函数的 prototype 原型对象,之所以我们对象可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有 __proto__原型的存在。
- 注意:
- __proto__是JS非标准属性
- [[prototype]]和__proto__意义相同
- 用来表明当前实例对象指向哪个原型对象prototype
- __proto__对象原型里面也有一个 constructor属性,指向创建该实例对象的构造函数
3.4 原型继承
- 继承是面向对象编程的另一个特征,通过继承进一步提升代码封装的程度,JavaScript 中大多是借助原型对象实现继承的特性。
- 例子:
function Man() {this.head = 1;this.eyes = 2;this.legs = 2;this.say = function() {},this.eat = function() {} } const pink = new Man()function Woman() {this.head = 1;this.eyes = 2;this.legs = 2;this.say = function() {},this.eat = function() {},this.baby = function() {} } const red = new Woman() - 对上面例子进行改造:
- 封装-抽取公共部分
- 把男人和女人公共的部分抽取出来放到人类里面。
- 继承-让男人和女人都能继承人类的一些属性和方法
- 把男人女人公共的属性和方法抽取出来 People
- 然后赋值给Man的原型对象,可以共享这些属性和方法
- 注意让constructor指回Man这个构造函数
- 问题:
- 如果我们给男人添加了一个吸烟的方法,发现女人自动也添加这个方法。
- 原因:男人和女人都同时使用了同一个对象,根据引用类型的特点,他们指向同一个对象,修改一个就会都影响
- 解决:男人和女人不要使用同一个对象,但是不同对象里面包含相同的属性和方法。
- 继承写法完善
- 封装-抽取公共部分
- 最后代码:
const People = {head: 1;eyes: 2;legs: 2;say: function() {},eat: function() {} }// 男人 function Man() { } // 用 new Person() 替换刚才的固定对象 Man.prototype = new Person() // 注意让原型里面的constructor重新指回Man Man.prototype.constructor = Man const pink = new Man() Man.prototype.smoking = function() {} console.log(pink)// 女人 function Woman() {this.bady = function() {} } // 用 new Person() 替换刚才的固定对象 Woman.prototype = new Person() // 注意让原型里面的constructor重新指回Woman Woman.prototype.constructor = Woman const red = new Woman() console.log(red) - 思路:真正做这个案例,我们的思路应该是先考虑大的,后考虑小的
- 人类共有的属性和方法有那些,然后做个构造函数,进行封装,一般公共属性写到构造函数内部,公共方法,挂载到构造函数原型身上。
- 男人继承人类的属性和方法,之后创建自己独有的属性和方法
- 女人同理
3.5 原型链
- 基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将原型对象的链状结构关系称为原型链
- 原型链-查找规则:
- 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
- 如果没有就查找它的原型(也就是 __proto__指向的 prototype 原型对象)
- 如果还没有就查找原型对象的原型(Object的原型对象)
- 依此类推一直找到 Object 为止(null)
- __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
- 可以使用 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
相关文章:
【JS】Chapter14-深入面向对象
站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 (十四)深入面向对象 1. 编程思想 1.1 面向过程介绍 面向过程就是分析出解决问题所需要的步骤,…...
RabbitMQ消息队列快速入门
RabbitMQ消息队列快速入门 初始MQ MQ全称为Message Queue,即消息队列,是在消息的传输过程中保存消息的容器。它是典型的生产者-消费者模型。 生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。消息的生产和消费都是异步的&am…...
django DRF认证组件
一、学习DRF的认证类; 设计:LoginView不登录就可以访问,UserView和OrderView需要通过认证后才能访问; 1、urls.py urlpatterns [path(login/, views.LoginView.as_view()),path(user/, views.UserView.as_view()),path(order/,…...
操作系统(三)| 进程管理上 进程状态 同步 互斥
目录 1 进程和程序区别 2 进程状态 2.1 进程的5种基本状态 2.2 进程状态之间转换 2.3 七状态模型 3 进程描述 3.1 进程控制块 PCB 3.2 进程块组织方式 4 进程控制 5 进程同步 互斥 5.1 区分进程互斥和同步 5.2 核心方案 5.3 其他方案 方案1 设置锁变量 方案2 严…...
Postman插件如何安装(一)
我们chrome插件网热门推荐的软件之一就是postman。但是postman的适应平台分为:postman chrome应用程序,postman应用程序,postman插件。谷歌应用商店从2018年3月开始停止chrome应用程序的更新。除非继续使用老版本的postman chrome应用程序&am…...
在回调之间共享数据
可以在 App 中为 UI 组件编写回调函数,以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中,回调函数通常必须访问主 App 函数中定义的数据,或与其他回调函数共享数据。例如,如果创建一个具有列表框的 App&a…...
我在CSDN开组会1-蒙特卡洛模拟在矿床学的应用展望
各位老师、同学们,大家好。今天组会的内容是蒙特卡洛模拟在矿床学的应用展望。 为什么要讲蒙特卡洛模拟呢,因为我发现在地质学方面已经有不少应用,但是蒙特卡洛模拟延伸的知识太晦涩了,劝退了很多探究者们。因此,计划…...
Jmeter 性能测试基础!
压力测试 压力测试分两种场景:一种是单场景,压一个接口的;第二种是混合场景,多个有关联的接口。压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。 压测任…...
【赠书第6期】MATLAB科学计算从入门到精通
文章目录 前言 1 安装与配置 2 变量定义 3 数据处理 4 绘图 5 算法设计 6 程序调试 7 推荐图书 8 粉丝福利 前言 MATLAB 是一种高级的科学计算和数据可视化平台。它由 MathWorks 公司开发,是科学研究、数据分析和工程实践中非常常用的一种软件工具。本文将…...
Java语言基础第五天
精华笔记: 循环结构: for结构:应用率最高,与次数相关的循环 三种结构如何选择: 先看循环是否与次数相关: 若相关-----------------------------直接上for 若无关,再看要素1与要素3的代码是否相…...
linux网络——HTTPS加密原理
目录 一.HTTPS概述 二.概念准备 三.为什么要加密 四.常⻅的加密⽅式 1.对称加密 2.⾮对称加密 五.数据摘要,数字签名 六.HTTPS的加密过程探究 1.方案一——只使用对称加密 2.方案二——只使⽤⾮对称加密 3.方案三——双⽅都使⽤⾮对称加密 4.方案四——⾮…...
shell 各种括号作用总结
技巧小结: 字符串比较用双中括号[[ ]] 算数比较用单中括号[ ]——左右留空格 算数运算用双小括号(( )) shell命令及输出用小括号( )——左右不留空格 快速替换用花括号{ }——左右留空格 反单引号起着命令替换的作用 一、单括号(): 1、另开命令组——小…...
2023-11-18 mysql-sysbench压测TPS/QPS-记录
摘要: 2023-11-18 mysql-sysbench压测TPS/QPS sysbench压测TPS/QPS 使用 sysbench 压测 TPS/QPS 的基础测试数据是 6 张表,每张表写入 10 万行数据,然后在此基础测试数据上分别进行 300 秒的混合写、更新、删除压测。 sysbench --mysql-host=192.168.41.xxx --mysql-port=3…...
树与二叉树堆:树
目录 树: 树的概念: 树的相关概念: 1、结点的度: 2、叶节点:度为0的节点 3、非终端节点或分支节点: 4、父节点和子节点: 5、兄弟节点: 6、树的度: 7、树的层次或…...
【监控系统】日志可视化监控体系ELK搭建
1.ELK架构是什么 ELK是ElasticsearchLogstashKibana的简称。 Elasticsearch是一个开源的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,它构建在Lucene搜索引擎库之上,是当前使用较为广泛的开源搜索引擎之一。 Logstash是一个…...
【Linux】22、CPU 评价指标、性能工具、定位瓶颈、优化方法论:应用程序和系统
文章目录 一、评价 CPU 的指标1.1 CPU 使用率1.2 平均负载(Load Average)1.3 上下文切换1.4 CPU 缓存命中率 二、性能工具2.1 维度:从 CPU 性能指标出发,即当你查看某性能指标时,要清除知道哪些工具可以做到2.2 维度&a…...
Foodpanda API连接的艺术:无代码开发如何集成营销系统和广告推广工具
连接Foodpanda和电商平台的无代码开发 Foodpanda不仅是一家提供快速外卖服务的国际品牌,而且其创新的技术解决方案还能帮助电商企业优化系统运营。通过无代码开发的方法,即使没有专业的API开发知识,商家也能实现高效的电商系统和客服系统连接…...
SpringBoot——数据访问
优质博文:IT-BLOG-CN 对于数据访问层,无论是SQL还是NoSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入各种xxxTemplate,xxxRepository来简化我们对数据访…...
【C++深度剖析学习总结】28 函数对象分析
1.客户需求 编写一个函数,满足三个需求 函数可以获得斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 for(int i =0; i<10; i++) { cout << fib() << endl; } 第一个解决方案 #include<iostream> #include<string> using na…...
持续集成部署-k8s-配置与存储-配置管理:SubPath
持续集成部署-k8s-配置与存储-配置管理:SubPath 1. 简介2. 测试 挂载文件目录3. subPath 解决挂载目录时覆盖原容器内文件夹1. 简介 在Kubernetes (K8s) 中,SubPath是用于指定容器内部目录挂载的一个属性。它可以在Pod中指定某个Volume挂载到容器内部的特定目录下,以便容器…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
