当前位置: 首页 > news >正文

【JS】Chapter14-深入面向对象

站在巨人的肩膀上

黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程

(十四)深入面向对象

1. 编程思想

1.1 面向过程介绍

  • 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。
  • 面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。

1.2 面向对象介绍

  • 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。
  • 面向对象是以对象功能来划分问题,而不是步骤。
  • 在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工。
  • 面向对象编程具有灵活、代码可复用、容易维护和开发的优点,更适合多人合作的大型软件项目。
  • 面向对象的特性:
    • 封装性
    • 继承性
    • 多态性

1.3 面向过程和面向对象的对比

  • 面向过程编程:
    • 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。
    • 缺点:没有面向对象易维护、易复用、易扩展
  • 面向对象编程:
    • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
    • 缺点:性能比面向过程低

2. 构造函数

  • 封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装。
  • 同样的将变量和函数组合到了一起并能通过 this 实现数据的共享,所不同的是借助构造函数创建出来的实例对象之间是彼此不影响的
  • 总结:
    1. 构造函数体现了面向对象的封装特性
    2. 构造函数实例创建的对象彼此独立、互不影响
  • 封装是面向对象思想中比较重要的一部分,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()
    
  • 对上面例子进行改造:
    1. 封装-抽取公共部分
      • 把男人和女人公共的部分抽取出来放到人类里面。
    2. 继承-让男人和女人都能继承人类的一些属性和方法
      • 把男人女人公共的属性和方法抽取出来 People
      • 然后赋值给Man的原型对象,可以共享这些属性和方法
      • 注意让constructor指回Man这个构造函数
    3. 问题:
      • 如果我们给男人添加了一个吸烟的方法,发现女人自动也添加这个方法。
      • 原因:男人和女人都同时使用了同一个对象,根据引用类型的特点,他们指向同一个对象,修改一个就会都影响
      • 解决:男人和女人不要使用同一个对象,但是不同对象里面包含相同的属性和方法。
    4. 继承写法完善
  • 最后代码:
    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)
    
  • 思路:真正做这个案例,我们的思路应该是先考虑大的,后考虑小的
    1. 人类共有的属性和方法有那些,然后做个构造函数,进行封装,一般公共属性写到构造函数内部,公共方法,挂载到构造函数原型身上。
    2. 男人继承人类的属性和方法,之后创建自己独有的属性和方法
    3. 女人同理

3.5 原型链

  • 基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将原型对象的链状结构关系称为原型链
  • 原型链-查找规则:
    1. 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
    2. 如果没有就查找它的原型(也就是 __proto__指向的 prototype 原型对象)
    3. 如果还没有就查找原型对象的原型(Object的原型对象)
    4. 依此类推一直找到 Object 为止(null)
    5. __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
    6. 可以使用 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

相关文章:

【JS】Chapter14-深入面向对象

站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 (十四)深入面向对象 1. 编程思想 1.1 面向过程介绍 面向过程就是分析出解决问题所需要的步骤&#xff0c…...

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挂载到容器内部的特定目录下,以便容器…...

MPI并行编程与GPU加速集成技术解析

1. MPI并行编程模型解析 在当今高性能计算领域&#xff0c;分布式内存架构已成为处理大规模科学计算问题的标准配置。这种架构通过将计算任务分解到多个节点并行执行&#xff0c;能够显著提升计算效率。作为这一领域的核心技术标准&#xff0c;消息传递接口(MPI)定义了进程间通…...

天梯赛L3-026传送门:用Splay树模拟‘交换后缀’,保姆级代码逐行解析

天梯赛L3-026传送门&#xff1a;用Splay树模拟‘交换后缀’&#xff0c;保姆级代码逐行解析 在算法竞赛中&#xff0c;数据结构的选择往往决定了解决问题的效率与优雅程度。天梯赛L3-026传送门这道题目&#xff0c;表面上看是一个关于路径操作的模拟题&#xff0c;实则暗藏了对…...

计算机能效标准下的功耗优化:从芯片到系统的设计实践

1. 项目概述&#xff1a;计算机能效标准化的时代浪潮作为一名在电子工程和电源管理领域摸爬滚打了十几年的从业者&#xff0c;我亲眼见证了计算设备从单纯追求性能到如今性能与能效并重的深刻转变。最近&#xff0c;关于美国加州可能率先推出针对计算机和显示器的强制性能效标准…...

Qt Creator配置ARM64开发环境避坑指南:从源码编译qmake到Kit设置

Qt Creator配置ARM64开发环境避坑指南&#xff1a;从源码编译qmake到Kit设置 在嵌入式开发领域&#xff0c;ARM64架构正逐渐成为主流选择。对于使用Qt框架的开发者来说&#xff0c;如何在Qt Creator中正确配置ARM64交叉编译环境&#xff0c;往往成为项目启动的第一道门槛。本文…...

基于AI与RPA的智能求职自动化系统设计与实现

1. 项目概述&#xff1a;当求职自动化遇上AI与RPA最近在技术社区里&#xff0c;看到不少朋友在讨论一个叫auto_job__find__chatgpt__rpa的项目。光看这个标题&#xff0c;就让我这个在招聘和自动化领域摸爬滚打了十来年的老鸟眼前一亮。这名字拆开来看&#xff0c;auto_job_fin…...

账户维护、登出与多模态文件独立接口

1&#xff09;登出&#xff1a;Header 或 Query 传 TokenPostMapping("/logout")public Result<Void> logout(RequestHeader(value "Authorization", required false) String authorization,RequestParam(value "token", required fal…...

为AI编码助手集成sh-guard:语义化Shell命令安全防护实践

1. 项目概述&#xff1a;为AI编码助手装上“安全刹车”最近在折腾各种AI编码助手&#xff0c;从Cursor到Claude Code&#xff0c;再到本地部署的Codex&#xff0c;效率提升确实肉眼可见。但用久了&#xff0c;心里总有点发毛——这些AI助手动动嘴皮子就能执行rm -rf、curl | ba…...

Anse多会话模式详解:单次对话、连续对话与AI绘图实战

Anse多会话模式详解&#xff1a;单次对话、连续对话与AI绘图实战 【免费下载链接】anse Supercharged experience for multiple models such as ChatGPT, DALL-E and Stable Diffusion. 项目地址: https://gitcode.com/gh_mirrors/an/anse Anse是一款强大的AI工具&#…...

终极AMD处理器调试指南:5步掌握SMUDebugTool核心调优技巧

终极AMD处理器调试指南&#xff1a;5步掌握SMUDebugTool核心调优技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

如何做好营销策划?营销策划的步骤是什么?

从代工到品牌&#xff1a;中小企业如何用“创意岛之光品牌100工程”实现溢价引言在当今竞争激烈的市场环境中&#xff0c;许多中小企业面临着“有产品无品牌”的困境。他们拥有优质的产品和技术&#xff0c;却缺乏清晰的品牌定位和价值表达。这不仅限制了企业的市场竞争力&…...