JS高级 -- 深入面向对象

news2024/11/28 22:47:07

1. 编程思想

1.1 面向过程

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

面向过程,就是按照我们分析好了的步骤,按照步骤解决问题

eg:蛋炒饭

优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。

缺点:没有面向对象易维护、易复用、易扩展

1.2 面向对象(oop)

面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。

面向过程,是以对象功能来划分问题,而不是步骤

eg:盖浇饭

在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工

面向对象编程具有灵活、代码可复用、容易维护和开发的优点,更适合多人合作的大型软件项目

面向对象的特性:封装性、继承性、多态性

优点:易维护、易复用、易扩展,由于面向对象有封装继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低

2. 构造函数

封装是面向对象思想中比较重要的一部分,is面向对象可以通过构造函数实现的封装

同样的将变量和函数组合到了一起并能通过 this 实现数据的共享,所不同的是借助构造函数创建出来的实例对象之间是彼此不影响的

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)

总结:
1.构造函数体现了面向对象的封装特性
2.构造函数实例创建的对象彼此独立、互不影响

  • 可以借助构造函数来实现面向对象编程的封装性、继承性
  • 构造函数方法很好用,但是存在浪费内存的问题

3. 原型

3.1 原型

  • 构造函数通过原型分配的函数是所有对象所 共享的
  • JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象
  • 这个对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存
  • 我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法
  • 构造函数和原型对象中的this 都指向 实例化的对象
function star(uname,age){
	this.uname = unae
	this .age = uge
}
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: functior(){console.log('唱歌') },
	dance: function () { console.log('跳舞') }
}
console.log(star.prototype.constructor) // 指向 Object


function 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__是S非标准届性
  • [[prototype]]和 __ proto __意义相同
  • 用来表明当前实例对象指向哪个原型对象prototype
  • __ proto __ 对象原型里面也有一个 constructor属性,指向创建该实例对象的构造函数

在这里插入图片描述

3.4 原型继承

继承是面向对象编程的另一个特征,通过继承进一步提升代码封装的程度,JavaScript 中大多是借助原型对象实现继承

的特性。

<body>
  <script>
    // 继续抽取   公共的部分放到原型上
    // const Person1 = {
    //   eyes: 2,
    //   head: 1
    // }
    // const Person2 = {
    //   eyes: 2,
    //   head: 1
    // }
    // 构造函数  new 出来的对象 结构一样,但是对象不一样
    function Person() {
      this.eyes = 2
      this.head = 1
    }
    // console.log(new Person)
    // 女人  构造函数   继承  想要 继承 Person
    function Woman() {

    }
    // Woman 通过原型来继承 Person
    // 父构造函数(父类)   子构造函数(子类)
    // 子类的原型 =  new 父类  
    Woman.prototype = new Person()   // {eyes: 2, head: 1} 
    // 指回原来的构造函数
    Woman.prototype.constructor = Woman

    // 给女人添加一个方法  生孩子
    Woman.prototype.baby = function () {
      console.log('宝贝')
    }
    const red = new Woman()
    console.log(red)
    // console.log(Woman.prototype)
    // 男人 构造函数  继承  想要 继承 Person
    function Man() {

    }
    // 通过 原型继承 Person
    Man.prototype = new Person()
    Man.prototype.constructor = Man
    const pink = new Man()
    console.log(pink)
  </script>
</body>

3.5 原型链

基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将原型对象的链状结构关系称为原型链

在这里插入图片描述
只要是对象就有__proto__,只要是原型对象里面就有constructor

<body>
  <script>
    // function Objetc() {}
    console.log(Object.prototype)
    console.log(Object.prototype.__proto__)

    function Person() {

    }
    const ldh = new Person()
    // console.log(ldh.__proto__ === Person.prototype)
    // console.log(Person.prototype.__proto__ === Object.prototype)
    console.log(ldh instanceof Person)
    console.log(ldh instanceof Object)
    console.log(ldh instanceof Array)
    console.log([1, 2, 3] instanceof Array)
    console.log(Array instanceof Object)
  </script>
</body>

查找原则:

① 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。

② 如果没有就查找它的原型(也就是 __proto__指向的 prototype 原型对象)

③ 如果还没有就查找原型对象的原型(Object的原型对象)

④ 依此类推一直找到 Object 为止(null)

⑤ __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线

⑥ 可以使用 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

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

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

相关文章

Win10电脑开机蓝屏多次重启无效怎么办?

Win10电脑开机蓝屏多次重启无效怎么办&#xff1f;有用户在使用电脑的时候遇到了系统蓝屏的问题&#xff0c;想要通过重新启动的方式来解决问题&#xff0c;但是多次重新启动电脑都还是遇到蓝屏的问题。那么这个情况要怎么去进行解决呢&#xff1f;来看看以下的处理方法吧。 准…

数字化转型导师坚鹏:数字化转型背景下的保险公司人力资源管理

数字化转型背景下的保险公司人力资源管理 课程背景&#xff1a; 很多保险公司存在以下问题&#xff1a; 不清楚保险公司数字化转型目前的发展阶段与重要应用&#xff1f; 不知道保险公司数字化转型给保险公司人力资源管理带来哪些机遇与挑战&#xff1f; 不知道保险公司…

速锐得从冷链管理数字网关看工业物联网的发展与创新

工业互联网倡导者将其称为“第三次创新”。但如果真是这样&#xff0c;我们就仍处于发展初期&#xff0c;因为数字互联网技术的全部潜能尚未在工业技术领域全面实现。 我们可以看到智能设备和智能系统开始与工业机器、处理器、云联结&#xff0c;但并没有形成行业规模。创建工…

使用express框架+mongodb快速搭建后端项目

首先node环境不用多说 然后我们使用express脚手架 express-generator 快速创建项目目录 全局安装express-generator npm i -g express-generator 复制代码 接着使用express命令创建项目, programnem是你的项目文件夹名 express <programname> 复制代码 然后我们就…

2023五一数学建模竞赛(五一赛)选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;无人机定点投放问题 这道题是传统的物理类题目&#xff0c;基本每次建模竞赛都会有。由于这道题目并未给明数据&#xff0c;所以数据获取和搜集资料是…

文件共享服务

~ 创建用户目录共享文件夹 ~ 本地目录为&#xff1a;d:/share\users&#xff0c;允许所有域用户可读可写。在本目录下为所有用户据添加一个以名称命名的文件夹&#xff0c;该文件夹将设置为所有域用户的home目录&#xff0c;用户登录计算机成功后&#xff0c;自动映射改在到H卷…

智尚转债上市价格预测

智尚转债 基本信息 转债名称&#xff1a;智尚转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;6.9958亿元。 正股名称&#xff1a;南山智尚&#xff0c;今日收盘价&#xff1a;11.49元&#xff0c;转股价格&#xff1a;12.33元。 当前转股价值 转债面值 …

R语言 | 因子

目录 一、使用factor()函数或as.factor()函数建立因子 二、指定缺失的Levels值 三、labels参数 四、因子的转换 五、数值型因子转换时常见的错误 六、再看levels参数 七、有序因子 八、table()函数 九、认识系统内建的数据集 在类别数据中&#xff0c;有些数据是可以排序…

适用于Windows PC和Mac的最佳录屏软件Camtasia2023强悍来袭

Camtasia2023是一款屏幕录制和视频剪辑软件&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 让您用更短的时间创作更多的视频。无需任何经验&…

继富士康之后,又一个8万人大厂转移印度,但仍在中国留有后路

日前消息指和硕旗下的昌硕工厂正在搬迁&#xff0c;预计将全数搬迁至印度&#xff0c;这是苹果代工厂之中又一家跟随苹果的脚步转移至印度&#xff0c;那么印度制造真的靠谱么&#xff1f; 苹果推动代工厂向印度转移似乎已是坚定不移&#xff0c;它最先推动纬创远赴印度设厂&am…

【Redis16】Redis进阶:内存优化

Redis进阶&#xff1a;内存优化 在基础学习的最后一篇&#xff0c;我们了解到了 Redis 的底层数据类型可以通过 OBJECT ENCODING 来进行查看。也了解过一些关于这些底层数据类型的知识。今天&#xff0c;我们就来更加深入的学习一下这些底层的数据类型&#xff0c;并据此来了解…

Opera 推出 Opera One,将取代 Opera 浏览器

Opera 日前推出了一款名为 Opera One 的新浏览器&#xff0c;该浏览器正处于开发者预览阶段&#xff0c;用户可以访问官网下载试用(链接)。这个浏览器的终极目标是在今年晚些时候取代其当家的 Opera 浏览器。 Opera One 遵循 "模块化设计理念"&#xff0c;并使用新的…

杭州云降价只是敲锣

1. 陈年旧事 大约是2015年&#xff0c;某友商宣布存储免费&#xff0c;当时我们公司如临大敌&#xff0c;我也被拽过去开会。后来我们才发现……对方的套路是&#xff1a; 文件存储原始收费是一毛钱。文档存储免费的条件是&#xff0c;需要客户当月有一次下载文件的行为才能免费…

不要随便给猎头简历!不沟通就瞎投简历,毁了金三银四的大厂面试!

许多人找工作时都会通过猎头&#xff0c;那么猎头到底是帮大忙还是帮倒忙呢&#xff1f; 一位网友提示大家&#xff1a; 不要随便给猎头简历&#xff01;金三银四的这一轮大厂面试彻底被一个猎头搅了&#xff0c;不沟通就瞎投简历&#xff0c;还美其名曰帮忙安排合适的岗位。 许…

从软件哲学角度谈 Amazon SageMaker

如果你喜欢哲学并且你是一个 IT 从业者&#xff0c;那么你很可能对软件哲学感兴趣&#xff0c;你能发现存在于软件领域的哲学之美。本文我们就从软件哲学的角度来了解一下亚马逊云科技的拳头级产品 Amazon SageMaker&#xff0c;有两个出发点&#xff1a;一是 SageMaker 本身设…

15天学习MySQL计划-锁(进阶篇)-第十天

15天学习MySQL计划-锁&#xff08;进阶篇&#xff09;-第十天 锁 1.概述 1.介绍 ​ 锁是计算机协调多个进程或线程并发访问某个资源的机制。数据库中&#xff0c;除传统的计算资源&#xff08;cpu&#xff0c;ram&#xff0c;i/o&#xff09;的争用以外&#xff0c;数据也是…

java实现NER模型识别问题中的实体

代码如下&#xff1a; String question "飞毛腿hw4x精品电池适用于哪些机型&#xff1f;";//1、NER模型识别问题中的实体List<String> list1 com.colorbin.rpa.c_magic_ai.c02_nlp.nlpUtil.getPerson(new String[]{question});List<String> list2 co…

完整数据分析体系概述

一、建设的出发点 满足业务需求&#xff0c;是建设数据分析体系的出发点&#xff0c;也是最终目的和最高要求。要注意的是&#xff0c;“业务需求”并没有统一的标准。不同部门&#xff0c;不同身份的人&#xff0c;需求是不一样的。从大的方面看&#xff0c;可以分作三个层级…

用户界面对象的线程亲缘性第一篇: 窗口

不同的对象具有不同的线程亲缘性规则&#xff0c;但其基本原则来自古老的 16 位 Windows。 在 Windows 系统上&#xff0c;最重要的用户界面对象当然是窗口了。窗口对象有它自己的线程亲缘性。创建窗口的线程是与窗口具有不可分割关系的线程。非正式地说&#xff0c;线程”拥有…

Pytorch激活函数最全汇总

为了更清晰地学习Pytorch中的激活函数&#xff0c;并对比它们之间的不同&#xff0c;这里对最新版本的Pytorch中的激活函数进行了汇总&#xff0c;主要介绍激活函数的公式、图像以及使用方法&#xff0c;具体细节可查看官方文档。 目录 1、ELU 2、Hardshrink 3、Hardsigmoid…