【JavaScript面向对象】

news2024/11/18 1:35:20

JavaScript面向对象

  • 1 本节目标
  • 2 面向对象编程介绍
    • 2.1 两大编程思想
    • 2.2 面向过程编程POP
    • 2.3 面向对象编程OOP
    • 2.4 面向过程和面向对象的对比
  • 3 ES6中的类和对象
    • 3.1 对象
    • 3.2 类class
    • 3.3 创建类
    • 3.4 类constructor构造函数
    • 3.5 类添加方法
    • 3.6 三个注意点
  • 4 类的继承
    • 4.1 继承
    • 4.2 super关键字
  • 5 面向对象案例——tab栏切换

1 本节目标

  • 说出什么是面向对象
  • 说出类和对象的关系
  • 使用class创建自定义类
  • 说出什么是继承

2 面向对象编程介绍

2.1 两大编程思想

  • 面向过程
  • 面向对象

2.2 面向过程编程POP

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

2.3 面向对象编程OOP

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

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

在这里插入图片描述

3 ES6中的类和对象

  • 面向对象更贴近我们的实际生活,可使用面向对象描述现实世界事物,但事物分为具体的事物和抽象的事物。
  • 面向对象的思维特点:
    1> 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板);
    2> 对类进行实例化,获取类的对象。
  • 面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断的创建对象,使用对象,指挥对象做事情。

3.1 对象

  • 现实生活中,对象是一个具体的事物。
  • 在JavaScript中,对象是一组无序相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
  • 对象是由属性和方法组成的:
    1> 属性:事物的特征,在对象中用属性来表示(常用名词)
    2> 方法:事物的行为,在对象中用方法来表示(常用动词)

3.2 类class

  • 在ES6中新增加了类的概念,可使用class关键字声明一个类,之后以这个类来实例化对象。
  • 类抽象了对象的公共部分,它泛指某一大类(class)。
  • 对象特指某一个,通过实例化一个具体的对象。

3.3 创建类

  • 语法:
	class name {
    	//class body
    }
  • 创建实例:
var xx = new name();
  • 注意:类必须使用new实例化对象。
    在这里插入图片描述

3.4 类constructor构造函数

  • constructor()方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法,如果没有显示定义,类内部会自动给我们创建一个constructor()
    在这里插入图片描述
    在这里插入图片描述
  • 注意:
    1> 通过class关键字创建类,类名我们还是习惯性定义首字母大写
    2> 类里面有一个constructor()函数,可以接受传递过来的参数,同时返回实例对象
    3> constructor()函数只要new生成实例时,就会自动调用这个函数,如果我们不写这个函数,类也会自动生成这个函数
    4> 生成实例new不能省略
    5> 最后注意语法规范,创建类:类名后面不要加小括号,生成实例:类名后面加小括号,构造函数不需要加function

3.5 类添加方法

<!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>
</head>
<body>
    <script>
        // 1.创建类class 创建一个明星类
        class Star {
            // 类的共有属性放到constructor里面
            constructor(uname, age) {
                this.uname = uname;
                this.age = age;
            }
            sing(song) {
                // console.log('我唱歌');
                console.log(this.uname + song);
            }
        }
        // 2.利用类创建对象 new
        var ldh = new Star('刘德华',18);
        var zxy = new Star('张学友',20);
        // console.log(ldh);
        // console.log(zxy);

        ldh.sing('冰雨');
        zxy.sing('李香兰');
        // (1)类里面所有的函数不需要写function()
        // (2)多个函数或方法之间不需要添加逗号分隔
    </script>
</body>
</html>

在这里插入图片描述

3.6 三个注意点

  • 在ES6中类没有变量提升,所以必须先定义类,才能通过类实例化对象。
  • 类里面共有的属性和方法一定要加this使用。
  • 类里面的this指向问题。
    在这里插入图片描述

4 类的继承

4.1 继承

  • 程序中的继承:子类可以继承父类的一些属性和方法。
  • 语法:
class Father {
	// 父类
}
class Son extends Father {
	// 子类继承父类
}

在这里插入图片描述

4.2 super关键字

  • super关键字用于访问和调用对象父类上的函数,可以调用父类的构造函数,也可以调用父类的普通函数。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 注意:子类在构造函数中使用super,必须放到this前面(必须先调用父类的构造方法,再使用子类的构造方法)。

5 面向对象案例——tab栏切换

  • tab.html代码:
<!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>面向对象的tab栏切换</title>
    <link rel="stylesheet" href="./styles/tab.css">
    <link rel="stylesheet" href="./fonts/iconfont.css">
</head>
<body>
    <main>
        <h4>
            Js 面向对象 动态添加标签页
        </h4>
        <div class="tabsbox" id="tab">
            <!-- tab 标签 -->
            <nav class="fisrstnav">
                <!-- 左侧 -->
                <ul>
                    <li class="liactive"><span>测试1</span><span class="iconfont icon-guanbi"></span></li>
                    <li><span>测试2</span><span class="iconfont icon-guanbi"></span></li>
                    <li><span>测试3</span><span class="iconfont icon-guanbi"></span></li>
                </ul>
                <!-- 右侧 -->
                <div class="tabadd">
                    <span>+</span>
                </div>
            </nav>
 
            <!-- tab 内容 -->
            <div class="tabscon">
                <section class="conactive">测试1</section>
                <section>测试2</section>
                <section>测试3</section>
            </div>
        </div>
    </main>

    <script src="js/tab.js"></script>
</body>
</html>
  • tab.css代码:
 - {
    margin: 0;
    padding: 0;
}
 
ul li {
    list-style: none;
}
 
main {
    width: 960px;
    height: 500px;
    border-radius: 10px;
    margin: 50px auto;
}
 
main h4 {
    height: 100px;
    line-height: 100px;
    text-align: center;
}
 
.tabsbox {
    width: 900px;
    margin: 0 auto;
    height: 400px;
    border: 1px solid lightsalmon;
    position: relative;
}
 
nav ul {
    overflow: hidden;
}
 
nav ul li {
    float: left;
    width: 100px;
    height: 50px;
    line-height: 50px;
    text-align: center;
    border-right: 1px solid #ccc;
    position: relative;
}
 
nav ul li.liactive {
    border-bottom: 2px solid #ffffff;
    z-index: 999;
}
 
#tab input {
    width: 80%;
    height: 60%;
}
 
nav ul li span:last-child {
    position: absolute;
    user-select: none; /* 控制用户不能选中文本 */
    font-size: 12px;
    top: -18px;
    right: 0;
    display: inline-block;
    height: 20px;
}
 
.tabadd {
    position: absolute;
    /* width: 100px; */
    top: 0;
    right: 0;
}
 
.tabadd span {
    display: block;
    width: 20px;
    height: 20px;
    line-height: 20px;
    text-align: center;
    border: 1px solid #ccc;
    float: right;
    margin: 10px;
    user-select: none;
}
 
.tabscon {
    width: 100%;
    height: 300px;
    position: absolute;
    padding: 30px;
    top: 50px;
    left: 0px;
    box-sizing: border-box;
    border-top: 1px solid #ccc;
}
 
.tabscon section,
.tabscon section.conactive {
    display: none;
    width: 100%;
    height: 100%;
}
 
.tabscon section.conactive {
    display: block;
}
功能需求:
1.点击tab栏,可以切换效果
2.点击+号,可以添加tab项和内容项
	1>第一步:创建新的选项卡li和新的内容section
	2>第二步:把创建的两个元素追加到对应的父元素中
	3>以前的做法:动态创建元素createElement,但元素里面内容较多,需要innerHTML赋值,在appendChild追加到父元素里面
	4>现在高级做法:利用insertAdjacentHTML()可以直接把字符串格式元素添加到父元素中
	5>appendChild不支持追加字符串的子元素,insertAdjacentHTML支持追加字符串的元素
3.点击×号,可以删除当前的tab项和内容项
	1>×是没有索引号的,但是他的父亲li有索引号,这个索引号正是我们想要的索引号
	2>所以核心思路是:点击×号可以删除这个索引号对应的li和section
4.双击tab项文字或者内容项文字,可以修改里面的文字内容
	1>双击事件:ondblclick
	2>如果双击文字,会默认选定文字,此时需要双击禁止选中文字:window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
	3>核心思路:双击文字的时候,在里面生成一个文本框,当失去焦点或者按下回车然后把文本框输入的值给原先元素即可。
抽象对象:Tab对象
1.该对象有切换功能
2.该对象有添加功能
3.该对象有删除功能
4该对象有修改功能

在这里插入图片描述

  • tab.js:
// 声明全局变量that
var that;
class Tab {
    constructor(id) {
        // 获取元素
        that = this;
        // 获取大盒子
        this.main = document.querySelector(id);
        // 获取的是一开始准备好的li和section 不包含后来添加的
        /* this.lis = this.main.querySelectorAll('li');
        this.sections = this.main.querySelectorAll('section'); */

        // 获取+号
        this.add = this.main.querySelector('.tabadd');
        // 获取×号 应写进updateNode()里面 因为update会更新,只要新增一个关闭按钮,就会重新获取一次
        // this.remove = this.main.querySelectorAll('.icon-guanbi');

        // 获取li的父元素
        this.ul = this.main.querySelector('.firstnav ul:first-child');
        // 获取section的父元素
        this.fsection = this.main.querySelector('.tabscon');

        this.init();
    }
    // init() 初始化操作,让相关的元素绑定事件
    init() {
        this.updateNode();
        for(var i = 0; i < this.lis.length; i++) {
            this.lis[i].index = i; // 给每个小li都添加了一个属性index,里面存着当前li的索引号
            this.lis[i].onclick = this.toggleTab;
            // 每个小li都有一个删除按钮
            this.remove[i].onclick = this.removeTab;
            this.spans[i].ondblclick = this.editTab;
            this.sections[i].ondblclick = this.editTab;
        }

        // 点击按钮 只有一个 不需要循环
        this.add.onclick = this.addTab;
    }
    // 获取所有的li和section和remove还有span
    updateNode() {
        this.lis = this.main.querySelectorAll('li');
        this.sections = this.main.querySelectorAll('section');
        this.remove = this.main.querySelectorAll('.icon-guanbi');
        this.spans = this.main.querySelectorAll('.firstnav li span:first-child');
    }
    // 1.切换功能
    toggleTab() {
        // 排他思想
        that.clearClass();
        this.className = 'liactive'; //点击哪个li li具有liactive类样式
        that.sections[this.index].className = 'conactive'; //点击哪个li section具有conactive类样式
    }
    // 清除所有li和section类的样式
    clearClass() {
        for(var i = 0; i < this.lis.length; i++) {
            this.lis[i].className = ''; // 未被点击的li清除liactive类样式
            this.sections[i].className = ''; // 未被点击的section清除conactive类样式
        }
    }
    // 2.添加功能
    addTab() {
        // 排他思想
        that.clearClass();
        // 创建li元素和section元素
        var random = Math.random(); //生成一个随机数
        var li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';
        var section = '<section class="conactive">测试'+ random +'</section>';
        // 把这两个元素追加到对应的父元素里面
        that.ul.insertAdjacentHTML('beforeend', li);
        that.fsection.insertAdjacentHTML('beforeend',section);

        that.init();
    }
    // 3.删除功能
    removeTab(e) {
        e.stopPropagation(); // 阻止冒泡 防止触发li的切换点击事件
        var index = this.parentNode.index; // 错号的索引号等于他父亲li的索引号
        console.log(index);
        // 根据索引号删除对应的li和section  remove()方法可以直接删除指定的元素
        that.lis[index].remove();
        that.sections[index].remove();
        that.init();
        // 当我们删除了不是选中状态的li的时候,原来处于选定状态的li保持不变
        if(document.querySelector('.liactive')) return;
        // 当我们删除了选中状态的li的时候,让它的前一个li处于选定状态
        index--;
        // 如果前面为真 才会执行后面的 如果前面为假 则不再继续执行
        that.lis[index] && that.lis[index].click(); // click()手动调用点击事件,不需要鼠标触发
    }
    // 4.修改功能
    editTab() {
        var str = this.innerHTML;
        // 双击禁止选中文字
        window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
        // 双击后添加文本框
        this.innerHTML = '<input type="text" />';
        // 把原先的内容赋值给文本框
        var input = this.children[0]; // span的第一个孩子
        input.value = str;
        input.select(); // 让文本框里面的文字处于选定状态
        // 当我们离开文本框就把文本框里面的值给span
        input.onblur = function() {
            // 此时span是input的父亲
            this.parentNode.innerHTML = this.value;
        }
        // 按下回车也可以把文本框里面的值给span
        input.onkeyup = function(e) {
            if(e.key === 'Enter') {
                // 手动调用表单失去焦点事件 不需要鼠标离开操作
                this.blur();
            }
        }
    }
}
new Tab('#tab');
  • 效果图:
    在这里插入图片描述

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

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

相关文章

matlab 点云采样相关操作-源码复制粘贴即可

1.随机采样一个百分点的随机抽样 clc; clear; close all; % clear everything% Import point cloud pc pointCloud(Lion.xyz);% Plot all points pc.plot; % points are colored by z coordinate title(All Points, Color, w); view(0,0); snapnow;% Select randomly 5 perce…

FL Studio21免费吗?怎么下载最新中文版本?

FL Studio中文版已上线&#xff0c;自20.8版起已支持简体中文。推荐使用Windows 10系统安装&#xff0c; Windows 7系统设置FL Studio语言为中文时若出现乱码&#xff0c;可以将Win10系统中的“微软雅黑”字体复制并安装进Win7系统电脑中&#xff01;FL Studio支持什么格式的插…

【软考数据库】第四章 操作系统知识

目录 4.1 进程管理 4.1.1 操作系统概述 4.1.2 进程组成和状态 4.1.3 前趋图 4.1.4 进程同步与互斥 4.1.5 进程调度 4.1.6 死锁 4.1.7 线程 4.2 存储管理 4.2.1 分区存储管理 4.2.3 分页存储管理 4.2.…

进程与线程:同步和互斥

进程与线程&#xff1a;同步&互斥 同步&互斥的概念 ​ 进程具有异步性的特征。异步性是指各并发进程执行的进程的以各自独立的&#xff0c;不可预知的速度向前推进 同步 ​ 同步 亦称为直接制约关系&#xff0c;它是指为完成某种任务而建立的两个或多个进程&#xf…

虚拟主机解压/压缩功能说明

使用帮助说明 主机控制面板上点击文件管理&#xff0c;进入目录。 一、解压 windows操作系统: 鼠标移动到压缩文件&#xff0c;点击“解压” Linux操作系统&#xff1a; 压缩文件后点击解压按钮。 注意linux系统不支持rar在线解压&#xff0c;rar改名为zip也不能解压&…

JVM 调优

大部分的情况都是由于企业内部代码逻辑不合理导致。 JVM内部性能优化 栈上分配 方法内联 JVM的自适应调整 JVM改错 大并发内存不足OOM 内存泄漏GC频繁CPU飙升 JVM的调优的原则是让你各项指标尽可能的利用到你硬件的性能瓶颈。 JVM的性能优化可以分为代码层面和非代码层面。…

数据库系统工程师——第五章 网络基础知识

文章目录 &#x1f4c2; 第五章、网络基础知识 &#x1f4c1; 5.1 计算机网络概述 &#x1f4d6; 5.1.1 计算机网络的概念 &#x1f4d6; 5.1.2 计算机网络的分类 &#x1f4d6; 5.1.3 网络的拓扑结构 &#x1f4c1; 5.2 网络硬件基础 &#x1f4d6; 5.2.1 网络设备 &…

Linux 文件内容相关命令使用汇总

Linux操作系统有很多强大的文件内容相关命令&#xff0c;这些命令可以让您查看、分析和编辑文件。其中&#xff0c;最基本和常用的命令包括cat、more、less和head/tail等。除了这些基本命令之外&#xff0c;grep和find命令也是文件搜索和过滤方面的有力工具。 前言 我们这篇主…

UM2080F32 低功耗32 位 Sub1GHz 无线SOC收发器芯片

产品描述 UM2080F32 是广芯微电子&#xff08;广州&#xff09;股份有限公司研制的基于 ARM Cortex M0 内核的超低功 耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位 S o C 芯片。 UM2080F32 工作于 200MHz~960MHz 范围内&#xff0c;支持灵活可设的数据包格式&#xf…

危险试探,产品经理赋予AI人格来打造品牌忠诚度

图片来源&#xff1a;由无界 AI工具生成 你可能不会相信&#xff0c;你的手机很可能变成你的虚拟情人&#xff0c;升级情人需要升级手机&#xff0c;而你从此再也不想换其他品牌手机。 AI时代&#xff0c;赋予产品以人格&#xff0c;让用户爱上产品&#xff0c;这或许是接下来产…

Python整个颜色小网站,给刚刚失恋的他.........

一些过场剧情: 死党一直暗恋校花&#xff0c;但是校花对他印象也不差&#xff0c; 就是死党一直太怂了&#xff0c;不敢去找校花&#xff0c; 直到昨天看到校花登上了校董儿子的豪车&#xff0c; 死党终于彻底死心&#xff0c;大醉一场&#xff0c;作为他的兄弟&#xff0c…

井电双控智能取水计量设备-井电双控遥测终端机

井电双控遥测终端机/井电双控智能取水计量设备&#xff08;MGTR-W4122C&#xff09;是针对取水计量控制系统开发智能终端产品。集预收费、流量监测、电量监测、余额提醒、欠费停机、无线传输、远程控制等多种功能于一体&#xff0c;并可根据项目需求选择实体IC卡和APP电子卡取水…

【JavaEE】从收发消息的角度理解 TCP/IP 五层网络模型的封装与分用

文章目录 1 为什么需要分层&#xff1f;2 TCP/IP 五层网络模型3 数据的封装&#xff08;发送消息为例&#xff09;4 数据的分用&#xff08;接收消息为例&#xff09;5 实际网络环境上的封装与分用写在最后 1 为什么需要分层&#xff1f; 你问我为啥需要分层&#xff1f;那必然…

python+vue 健康体检预约管理系统

该专门体检预约管理系统包括会员和管理员。其主要功能包括个人中心、会员管理、体检服务管理、类型管理、订单信息管理、取消订单管理、 体检报告管理、通知信息管理、交流论坛、系统管理等功能。 目 录 一、绪论 1 1.1研发背景和意义 2 1.2 国内研究动态 3 1.3论文主…

US-DAT2-F、US-DAT2-A比例放大器接线

多路控制阀比例放大器接线端子定义&#xff1a; 序号 端口 名称 1 CMD1 1阀指令 2 CMD1- 1阀指令- 5 RS485_A - 6 RS485_B - 7 VREF_10V 参考电压10V 8 VREF_0V 参考电压0V 9 VAL1_A 1阀电磁铁A 10 VAL1_AB- 1阀电磁铁AB- 11 VAL1_B 1阀电磁铁B 12 PWR 电源 13 PWR…

Unreal5 实现角色动画重定向

解决问题&#xff1a; 有时候有的角色动画想用到另外的角色身上&#xff0c;不能直接用怎么办&#xff1f; 解决方案&#xff1a; 使用重定向 实现方式&#xff1a; 在资产里面创建IK绑定 在列表中选中需要绑定的骨骼网格体 需要创建两个&#xff0c;我这里是女人需要使用男…

【社区图书馆】PyTorch高级机器学习实战

PyTorch高级机器学习实战 作者&#xff1a;王宇龙&#xff0c;清华大学计算机博士&#xff0c;大型互联网公司算法专家&#xff0c;在国际学术会议及期刊发表过多篇论曾出版书籍《PyTorch深度学习入门与实战》&#xff0c;知乎"机器学习”话题优秀回答者。 亮点&#xf…

【Git 入门教程】第三节、Git的分支和合并

Git的分支和合并是Git中最重要的概念之一。使用Git可以轻松地创建、切换和合并分支&#xff0c;这为团队协作开发提供了极大的便利。在本文中&#xff0c;我们将介绍Git分支的基本概念和操作方式。 一、分支 在Git中&#xff0c;分支是指一个代码库的不同版本。分支允许开发者…

设计模式——设计模式简介、分类及面向对象设计原则

文章目录 前言一、什么是设计模式1、从面向对象谈起2、深入理解面向对象3、软件设计固有的复杂性4、软件设计复杂的根本原因——“变化”5、如何解决复杂性&#xff1f;6、软件设计的目标 二、常用设计模式及分类1、常用的七种设计模式2、设计模式分类 三、面向对象设计原则1、…

华为C++研发工程师编程题 ACM模式输入输出|| 1.汽水瓶,2.明明的随机数,3.进制转换

C ACM输入输出 1.汽水瓶题目描述思路代码如下 2.明明的随机数题目描述思路&#xff1a;代码如下&#xff1a; 3.进制转换题目描述思路&#xff1a;代码如下 题目链接&#xff1a; 华为研发工程师编程题 1.汽水瓶 题目描述 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水…