JS进阶 3——深入面向对象、原型

JS 进阶3——深入面向对象、原型

1.编程思想

  • 面向过程:分析出解决问题的过程,然后用函数将这些步骤一步步封装起来
  • 面向对象:将事物分为一个个对象,然后对象之间分工合作

2.构造函数:封装性、面向对象

  • 构造函数方法存在浪费内存的问题(构造函数中的方法每次调用)

      function Star(name, age) {this.name = namethis.age = agethis.sing = function () {console.log('我会唱歌')}}const xxg = new Star('小小怪', 18)const ddg = new Star('大大怪', 22)console.log(xxg.sing === ddg.sing) //返回false,重复创建两个sing
    

3.原型——解决构造函数浪费内存的问题

  • 什么是原型

    • 构造函数通过原型分配的函数是所有对象所共享的
    • JS中,每个构造函数都有一个prototype属性,指向另一个对象,称为原型对象
    • 原型对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存
    • 可以把不变的方法直接定义到prototype对象上,这样所有对象的实例可以共享这些方法
    • 构造函数和原型对象中的this都指向实例化的对象
    //1.公共属性写到构造函数中function Star(name, age) {this.name = namethis.age = age}
    //2.公共方法写到原型对象身上Star.prototype.sing = function () {console.log('唱歌');}const xxg = new Star('小小怪', 18)const ddg = new Star('大大怪', 22)xxg.sing()ddg.sing()console.log(xxg.sing === ddg.sing) //返回true
    

    eg:为数组对象添加方法(注意想要不传参,就要使用this指向实例对象)

     //为数组拓展 求最大值方法Array.prototype.max = function () {return Math.max(...this)}//为数组拓展 求和方法Array.prototype.sum = function () {return this.reduce((prev, current) => prev + current)}const str = [1, 2, 3]console.log(str.max())console.log(str.sum())
    
  • constructor(构造函数)属性

    • 每个原型对象中都有一个constructor属性
    • 该属性指向该原型对象的构造函数,标明该原型对象属于哪个构造函数
    //创建一个构造函数function Star() {}//想要为该构造函数一次性挂载多个方法Star.prototype = {//重新指回创造这个原型对象的构造函数constructor: Star,sing: function () {console.log('我喜欢唱歌');},dance: function () {console.log('我喜欢跳舞');}}console.log(Star.prototype) //返回undefined//意味着找不到该原型对象的构造函数了//解决办法:在原型对象中重新指回创造这个原型对象的构造函数
    
  • 对象原型

    • 对象都会有一个 __ proto__ 指向构造函数的prototype原型对象,之所以对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象 __ proto __ 的存在
    • 只能获取不能赋值
    • 对象原型是实例对象的属性,指向原型对象,有一个属性constructor指向构造函数;原型对象是构造函数的属性,是一个对象,也有一个属性constructor指向构造函数
     function Star() { }const ldh = new Star()console.log(ldh.__proto__ === Star.prototype)//返回true
    
  • 原型继承

    • 借助原型对象实现继承的特性
        //人 父构造函数function People() {this.eyes = 2this.head = 1}//女人  构造函数 继承Peoplefunction Woman() {}//子类的原型 = new 父类,方便给子类添加特殊的属性和方法Woman.prototype = new People()//指回构造函数Woman.prototype.constructor = Woman//给女人添加方法Woman.prototype.baby = function () {console.log('宝贝')}const red = new Woman()console.log(red)//男人  构造函数 继承Peoplefunction Man() {}Man.prototype = new People()Man.prototype.constructor = Manconst blue = new Man()console.log(blue)
    
  • 原型链:就是一个查找规则,先从自身原型对象查找属性和方法,找不到就往上一层查找,原型链就是往上查找的这样一个路线。

在这里插入图片描述

  • instanceof运算符:用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
  • 案例:使用原型实现模态框封装:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>面向对象封装消息提示</title><style>.modal {width: 300px;min-height: 100px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);border-radius: 4px;position: fixed;z-index: 999;left: 50%;top: 50%;transform: translate3d(-50%, -50%, 0);background-color: #fff;}.modal .header {line-height: 40px;padding: 0 10px;position: relative;font-size: 20px;}.modal .header i {font-style: normal;color: #999;position: absolute;right: 15px;top: -2px;cursor: pointer;}.modal .body {text-align: center;padding: 10px;}.modal .footer {display: flex;justify-content: flex-end;padding: 10px;}.modal .footer a {padding: 3px 8px;background: #ccc;text-decoration: none;color: #fff;border-radius: 2px;margin-right: 10px;font-size: 14px;}.modal .footer a.submit {background-color: #369;}</style>
</head><body><button id="delete">删除</button><button id="login">登录</button><!-- <div class="modal"><div class="header">温馨提示 <i>x</i></div><div class="body">您没有删除权限操作</div></div> --><script>//构造函数封装——模态框function Modal(title = '', message = '') {//创建div标签this.modalBox = document.createElement('div')//给div标签添加类名为modalthis.modalBox.className = 'modal'//modal盒子内部填充2个div标签并且修改文字内容this.modalBox.innerHTML = `<div class="header">${title} <i>x</i></div><div class="body">${message}</div>`console.log(this.modalBox)}Modal.prototype.open = function () {const box = document.querySelector('.modal')//防止创建多个模态框,使其有则移除,没有就继续执行box && box.remove()document.body.append(this.modalBox)//x要在模态框创建完成后才能点击关闭this.modalBox.querySelector('i').addEventListener('click', () => {this.close()})}Modal.prototype.close = function () {this.modalBox.remove()}document.querySelector('#delete').addEventListener('click', () => {const del = new Modal('温馨提示', '您没有权限删除操作')del.open()})document.querySelector('#login').addEventListener('click', () => {const login = new Modal('友情提示', '您没有注册呢?')login.open()})</script>
</body></html>

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

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

相关文章

linux学习--第七天(多路复用IO)

多路复用IO -阻塞IO与非阻塞IO -IO模型 IO的本质时基于操作系统接口来控制底层的硬件之间数据传输&#xff0c;并且在操作系统中实现了多种不同的IO方式&#xff08;模型&#xff09;比较常见的有下列三种&#xff1a; 1.阻塞型IO模型 2.非阻塞型IO模型 3.多路复用IO模型 -阻…

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测 开源项目地址&#xff1a;https://gitcode.net/EricLee/yolo_v3 示例&#xff1a;

【C++】多态(下)

个人主页~ 多态&#xff08;上&#xff09;~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…

开放式耳机哪个品牌好?分享几款不错的开放式蓝牙耳机

相信很多人戴入耳式耳机时间一久&#xff0c;就不是很舒服。经常会有闷热、不透气的感觉&#xff0c;甚至有的朋友会因为佩戴入耳式耳机滋生细菌&#xff0c;导致最后炎症的发生。总之&#xff0c;入耳式耳机真的不适合长时间佩戴&#xff0c;而且佩戴的场景也有很多限制。 那…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么&#xff1f; 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别&#xff1a; 1、新建项目 Maven&#xff1a; Gradle&#xff1a; 2、配置项目 Maven&#xff1a; Gradle&#xff1a; 3、构建项目——生成项目的jar包 Gradle&…

Linux 信号详解

目录 一.前置知识 1.前台进程和后台进程 a.概念理解 b.相关指令 2.信号的前置知识 a.Linux 系统下信号的概念 b.进程对信号的处理方式 3.信号的底层机制 二.详解信号 1.信号的产生 a.键盘组合键 b.kill 指令和系统调用接口 ① kill 指令 ② kill() 系统调用接口 ③ raise() 系统…

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清&#xff1a; 1.首先&#xff0c;tcp四次挥手只有主动和被动方之分&#xff0c;没有客户端和服务端的概念 2.其次&#xff0c;发送报文段是tcp协议栈的行为&#xff0c;用户态调用close会陷入到内核态 3.再者&#xff0c;图中的情况前提是双…

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#x…

栏目二:Echart绘制动态折线图+柱状图

栏目二&#xff1a;Echart绘制动态折线图柱状图 配置了一个ECharts图表&#xff0c;该图表集成了数据区域缩放、双Y轴显示及多种图表类型&#xff08;折线图、柱状图、象形柱图&#xff09;。图表通过X轴数据展示&#xff0c;支持平滑折线展示比率数据并自动添加百分比标识&…

从原理到代码:如何通过 FGSM 生成对抗样本并进行攻击

从原理到代码&#xff1a;如何通过 FGSM 生成对抗样本并进行攻击 简介 在机器学习领域&#xff0c;深度神经网络的强大表现令人印象深刻&#xff0c;尤其是在图像分类等任务上。然而&#xff0c;随着对深度学习的深入研究&#xff0c;研究人员发现了神经网络的一个脆弱性&…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 10月3日,星期四

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年10月3日 星期四 农历九月初一 1、 应急管理部&#xff1a;10月华北东南部等部分地区洪涝和风雹灾害风险较高&#xff0c;可能有1-2个台风登陆或明显影响我国。 2、 中国海警舰艇首次进入北冰洋&#xff0c;与俄海警展开联…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景&#xff1a; 2.字符串函数 字符串函数使用场景&#xff1a; 3.数学函数 4.控制流函数 1.日期函数 函数示例&#xff1a; 1.在日期的基础上加日期 在该日期下&#xff0c;加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

C#知识|基于反射和接口实现抽象工厂设计模式

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中&#xff1b; 02 抽象工厂组成 抽象工厂包括抽象产品&#xff08;即业务接口&#xff0c;可以通过抽象类或抽象接口设计&#xff09;…

C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 前面说过纹理贴图能够大幅提升游戏画面质量,但纹理贴图是没有叠加的。在一些游戏场景中,要求将非常不同的多个纹理(如泥泞的褐色地面、绿草植密布的地面、碎石遍布的地面)叠加(混合)起来显示,实现纹理间能…

基于微信的乐室预约小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

信息安全工程师(24)网络安全体系建设原则与安全策略

一、网络安全体系建设原则 网络空间主权原则&#xff1a;维护网络空间主权是网络安全的首要原则。这要求国家在网络空间的管理、运营、建设和使用等方面具有完全自主的权利和地位&#xff0c;不受任何外部势力的干涉和侵犯。网络安全与信息化发展并重原则&#xff1a;网络安全与…

影视cms泛目录用什么程序?苹果cms二次开发泛目录插件

影视CMS泛目录一般使用的程序有很多种&#xff0c;&#xff08;maccmscn&#xff09;以下是其中几种常见的程序&#xff1a; WordPress&#xff1a;WordPress是一个非常流行的开源内容管理系统&#xff0c;可以通过安装一些插件来实现影视CMS泛目录功能。其中&#xff0c;一款常…

Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

vulnhub-Replay 1靶机

vulnhub&#xff1a;https://www.vulnhub.com/entry/replay-1,278/ 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.81.8&#xff0c;扫描端口 开启了三个端口&#xff0c;存在网站服务&#xff0c;访问 网页上有个超链接&#xff0c;点击后下载了这样一个…

Python开发环境配置(mac M2)

1. 前言 作为一名程序员&#xff0c;工作中需要使用Python进行编程&#xff0c;甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python&#xff0c;如何给Pycharm&#xff08;IDE&#xff09;配置对应的interpreter等&#xff0c;都成为一个 “不熟练工” 的难…