【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 属性是否出现在某个实例对象的原型链上

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

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

相关文章

【Python百宝箱】Python测试工具大揭秘:从单元测试到Web自动化

前言 在现代软件开发中,测试是确保代码质量和稳定性的关键步骤。Python作为一门广泛应用的编程语言,拥有丰富的测试工具和库,从单元测试到Web自动化,覆盖了多个测试层面。本文将介绍一系列Python测试工具,帮助开发者选…

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

日志门面slf4j与常用的日志框架Log4j,Logback和Log4j2

slf4j 是众多日志框架接口的集合(俗称日志门面),它不负责具体的日志实现,只在编译时负责寻找合适的日志框架进行绑定,各日志框架通过扩展jar包中的适配器与slf4j建立适配 SLF4J可以和Log4j、Logback、Log4j2、JUL等日志框架配合使用,这里主要…

【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

文章目录 一、类模板 - 函数声明与函数实现分离1、类模板 外部 实现 构造函数2、类模板 外部 实现 普通函数3、类模板 外部 实现 友元函数( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题( 2 ) 正确写法 二、代码示例 - 函数声明与函数实现分离1、代码示例2、执行…

go同步锁 sync mutex

goroutine http://127.0.0.1:3999/concurrency/11 go tour 到此 就结束了. 继续 学习 可以 从 以下网站 文档 https://golang.org/doc/ https://golang.org/doc/code https://golang.org/doc/codewalk/functions/ 博客 https://go.dev/blog/ wiki 服务器教程 服务器…

level=warning msg=“failed to retrieve runc version: signal: segmentation fault“

安装docker启动后,发现里面没有runc版本信息 目前看是少了runc组件 那我们安装runc https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 [rootlocalhost ~]# mv runc.amd64 /usr/bin/runc mv:是否覆盖"/usr/bin/runc&q…

Git 分支管理

目录 列出分支 删除分支 分支合并 合并冲突 几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。 使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。 Git 分支实际上是指向更改快照的指针。 有…

CAXA同一个窗口打开文件

重新关联,工具,文件关联工具

文档 + 模型

文档 模型 0: 基于MATLAB的soc锂电池系统设计 1: 电力系统继电保护仿真设计-毕业论文 2: 继电保护仿真-三段式电流保护的方案设计及分析-相间短路 3: 直流电机双闭环控制系统 转速电流双闭环调速 4: matlab电力系统继电保护仿真 三段电流保护仿真-双侧电源系统 5: OFDM-MIMO课…

python实现FINS协议的TCP服务端(篇二)

python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模块。本文为第二篇。

修复dinput8.dll丢失的简单方法,解决dinput8.dll丢失

在使用电脑时,电脑可能会出现一些特殊的情况,比如电脑中出现关于dinput8.dll丢失会找不到的情况,出现这样的情况可能会不知道该怎么办,但是出现这样的情况其实并不是一件很难解决的事情,修复dinput8.dll丢失方法也是比…

Delphi 取消与设置CDS本地排序

取消与设置CDS本地排序 取消CDS本地排序. cds.IndexDefs.Update; if cds.IndexName<> then begin if cds.IndexDefs.IndexOf(index1)>0 then cds.DeleteIndex(index1); cds.IndexDefs.Clear; cds.IndexName:; end; 设置CDS本地排序 c…

Robust Optimization, imperfect CSI, CSIT and CSIR

文章目录 写在前面CSI, CSIT and CSIR 写在前面 CSIT或者CSIR可不可以用来帮助实现隐蔽通信 人工噪声让窃听者估计出错误的信道。 CSI, CSIT and CSIR MIMO Minimum Total MSE Transceiver Design With Imperfect CSI at Both Ends 2009 TSP 多输入多输出 (MIMO) 系统已成为…

MySQL InnoDB 引擎底层解析(二)

6.2.InnoDB 的表空间 表空间是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个页的池…

关于Unity Time.deltaTime的理解和使用

Unity中的Time.deltaTime是一个表示上一帧到当前帧所用时间的浮点数。 它可以让Unity应用程序能够以平滑的方式在不同的帧率下运行。 要深刻理解Time.deltaTime&#xff0c;首先得了解Unity引擎得工作原理。 Unity引擎以每秒帧数&#xff08;FPS&#xff09;的形式运行。 比…

基于tcp协议及数据库sqlite3的云词典项目

这个小项目是一个网络编程学习过程中一个阶段性检测项目&#xff0c;过程中可以有效检测我们对于服务器客户端搭建的能力&#xff0c;以及一些bug查找能力。项目的一个简单讲解我发在了b站上&#xff0c;没啥心得&#xff0c;多练就好。 https://t.bilibili.com/86524470252640…

Shell判断:模式匹配:case(二)

简单的JumpServer 1、需求&#xff1a;工作中&#xff0c;我们需要管理N多个服务器。那么访问服务器就是一件繁琐的事情。通过shell编程&#xff0c;编写跳板程序。当我们需要访问服务器时&#xff0c;看一眼服务器列表名&#xff0c;按一下数字&#xff0c;就登录成功了。 2、…

JAVA毕业设计111—基于Java+Springboot+Vue的养老院管理系统(源码+数据库+12000字论文)

基于JavaSpringbootVue的养老院管理系统(源码数据库12000字论文)111 一、系统介绍 本系统前后端分离&#xff0c;本系统分为销售、人事、服务、餐饮、财务、超级管理员六种角色 系统主要功能如下&#xff1a; 首页统计&#xff1a;包括今日新增咨询、今日新增预定、今日新增…

AI资讯--Meta AI工具“指哪打哪“;OpenAI CEO事件梳理;

看点 Meta展示全新AI图像编辑工具&#xff1a;文本指令“指哪打哪”&#xff0c;主体背景都能换 &#x1f3a8;OpenAI CEO被董事会罢免36小时事件梳理 &#x1f552;OpenAI开掉了最能搞钱的创始人&#xff0c;GPT在他手里可能失控&#xff1f; &#x1f4b8;微软和兴盛资本向O…

树与二叉树堆:堆

堆的概念&#xff1a; 一般是把数组的数据在逻辑结构上看成一颗完全二叉树&#xff0c;如下图所示。 注意&#xff1a;别将C语言中的堆和数据结构的堆混为一谈&#xff0c;本文所讲的数据结构的堆是一种完全二叉树&#xff0c;而C语言中的堆其实是一种内存区域的划分 堆的分类…