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

详解ES6中的类、对象和类的继承

在ES6(ECMAScript 2015)之前,JavaScript 并没有像其他面向对象的编程语言那样的类(class)的概念。相反,它使用了一种基于原型的继承模型来实现面向对象编程。然而,这种模型对于许多开发者来说可能比较难以理解,特别是在与更传统的面向对象语言(如Java或C++)相比较时。

为了简化面向对象的编程范式并提供更直观的代码组织方式,ES6引入了类的概念。虽然JavaScript的类实际上是基于原型的继承和构造函数的语法糖,但它提供了一种更加清晰、简洁的方式来定义对象的行为和结构。

一、面向对象

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

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

面向对象的缺点:性能比面向过程低。

面向对象的思维特点:

(1) 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板) 。

(2) 对类进行实例化, 获取类的对象。

二、类和对象

2.1 对象

在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等,即万物皆对象。

对象是由属性和方法组成的:

属性:事物的特征,在对象中用属性来表示(常用名词)。

方法:事物的行为,在对象中用方法来表示(常用动词)。

2.2 类class

类抽象了对象的公共部分,它泛指某一大类(class)。

对象特指某一个,通过类实例化一个具体的对象。

2.3 创建类

语法:

class Name {// class body
}
创建实例:const xx = new Name();

2.4 类 constructor 构造函数

constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显式定义,类内部会自动给我们创建一个constructor()。

// 1. 创建类 class  创建一个人类
class Person {constructor(name, age) {this.name = name;this.age = age}
}
// 2. 利用类创建对象 new
const p1 = new Person('前端技术营', 18)
console.log(p1) //Person {age: 18, name: "前端技术营"}
console.log(p1.name) //前端技术营const p2 = new Person('张三', 22)
console.log(p2) //Person {age: 22, name: "张三"}
console.log(p2.age) // 22

注意:

  1. 通过class 关键字创建类,类名我们还是习惯性定义首字母大写。

  2. 类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象。

  3. constructor 函数只要 new 生成实例时,就会自动调用这个函数,如果我们不写这个函数,类也会自动生成这个函数。

  4. 生成实例 new 不能省略,类必须使用new实例化对象。

  5. 最后注意语法规范,创建类类名后面不要加小括号,生成实例类名后面加小括号,构造函数不需要加function。

2.5 类添加方法

// 1. 创建类 class  创建一个人类
class Person {constructor(name, age) {this.name = name;this.age = age}coding(code) {// somethingconsole.log(`${code}, ${this.name}`)}
}
// 2. 利用类创建对象 new
const p1 = new Person('前端技术营', 18)
console.log(p1) 
//Person {age: 18, name: "前端技术营"}
p1.coding('Hello,World') 
// Hello,World, 前端技术营const p2 = new Person('张三', 22)
console.log(p2) 
//Person {age: 22, name: "张三"}
p2.coding('JavaScript是世界上最好的语言之一') 
// JavaScript是世界上最好的语言之一, 张三

注意:

  1. 我们类里面所有的函数不需要写function。

  2. 多个函数方法之间不需要添加逗号分隔。

三、类的继承

继承:子类可以继承父类的一些属性和方法。

语法:

class Father { //父类// ...
}
class Son extends Father { //子类继承父类// ...
}

例如:

class Father {constructor() {// ...}money() {console.log(1000000)}
}
class Son extends Father { // 这样子类就继承了父类的属性和方法// ...
}
var son = new Son()
son.money() // 1000000

四、super关键字

super 关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数。

4.1 调用父类的构造函数

// 例如:

class Father {constructor(x, y) {this.x = x;this.y = y}sum() {console.log(this.x + this.y)}
}class Son extends Father {constructor(x, y) {super(x, y) //调用了父类中的构造函数}
}var son = new Son(1, 2);
var son1 = new Son(10, 20);
son.sum() // 3
son1.sum() // 30

注意:

子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)。

class Person {constructor(name) {this.name = name}say() {console.log('我是' + this.name)}
}
class Programmer extends Person { // 这样子类就继承了父类的属性和方法constructor(name, language) {super(name); //调用父类的constructor(name)this.language = language}writing() {console.log(`我是${this.name},正在疯狂写${this.language}`)}
}const p1 = new Programmer('前端技术营', 'JavaScript')
p1.say(); //我是前端技术营
p1.writing() //我是前端技术营,正在疯狂写JavaScript

4.2 调用父类的普通函数

class Father {say() {return '我是爸爸';}
}
// 这样子类就继承了父类的属性和方法
class Son extends Father { say() {// super.say()  super 调用父类的方法return super.say() + '的儿子';}
}
const son = new Son();
console.log(son.say()); //我是爸爸的儿子

注意:

  1. 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象。

  2. 类里面的共有属性和方法一定要加this使用。

  3. 类里面的this指向问题。

  4. constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者。

五、类里面的this指向问题

<button>点击</button>let that;
let _that;class Person {constructor(name, age) {// constructor 里面的this 指向的是 创建的实例对象that = this;console.log(this);this.name = name;this.age = age;// this.say();this.btn = document.querySelector('button');// this.say不加(),加()会自动调用this.btn.onclick = this.say;}say() {// 这个say方法里面的this 指向的是 btn 这个按钮,因为这个按钮调用了这个函数console.log(this); // <button>点击</button>// that里面存储的是constructor里面的thisconsole.log(that.name); // 前端技术营}study() {// 这个study里面的this 指向的是实例对象 ldh 因为ldh 调用了这个函数_that = this;console.log(this);// Person {name: '前端技术营', age: undefined, btn: button}}
}var p1 = new Person('前端技术营');
console.log(that === p1); // true
p1.study();
console.log(_that === p1); // true

相关文章:

详解ES6中的类、对象和类的继承

在ES6&#xff08;ECMAScript 2015&#xff09;之前&#xff0c;JavaScript 并没有像其他面向对象的编程语言那样的类&#xff08;class&#xff09;的概念。相反&#xff0c;它使用了一种基于原型的继承模型来实现面向对象编程。然而&#xff0c;这种模型对于许多开发者来说可…...

游戏遇到攻击有什么办法能解决?

随着网络技术的飞速发展&#xff0c;游戏行业在迎来繁荣的同时&#xff0c;也面临着日益严峻的网络威胁。黑客攻击、数据泄露、DDoS攻击等安全事件频发&#xff0c;给游戏服务器带来了极大的挑战。面对愈演愈烈的网络威胁&#xff0c;寻找一个能解决游戏行业攻击问题的安全解决…...

【LLM】GLM系列模型要点

note 文章目录 noteGLM一、数据层面1. 预训练数据 二、GLM4模型层面三、GLM-4 All Tools四、GLM的其他技术Reference GLM Paper&#xff1a;https://arxiv.org/abs/2406.12793 GitHub&#xff1a;https://github.com/THUDM HF&#xff1a;https://huggingface.co/THUDM 经过…...

安卓开发,获取本机手机号

用免费云服务器&#xff0c;三丰云记录安卓开发过程 以下是使用 Android 开发获取本机手机号的示例代码&#xff08;需要相关权限&#xff09;&#xff1a; java 复制 import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; i…...

linux学习week1

linux学习 一.介绍 1.概述 linux的读法不下10种 linux是一个开源的操作系统&#xff0c;操作系统包括mac、windows、安卓等 linux的开发版&#xff1a;Ubuntu&#xff08;乌班图&#xff09;、RedHat&#xff08;红帽&#xff09;、CentOS linux的应用&#xff1a;linux在服…...

【React篇】父组件渲染时避免重复渲染子组件的3种处理方法

在 React 中&#xff0c;父组件渲染时要避免重复渲染子组件&#xff0c;可以使用以下方法&#xff1a; 使用 React.memo&#xff08;仅适用于函数式组件&#xff09;或 PureComponent&#xff08;适用于类组件&#xff09;&#xff1a; 这些方法可以帮助你创建在接收到新的 pr…...

深度神经网络——决策树的实现与剪枝

概述 决策树 是一种有用的机器学习算法&#xff0c;用于回归和分类任务。 “决策树”这个名字来源于这样一个事实&#xff1a;算法不断地将数据集划分为越来越小的部分&#xff0c;直到数据被划分为单个实例&#xff0c;然后对实例进行分类。如果您要可视化算法的结果&#xf…...

IOPaint前后端框架

IOPaint 前后端框架 IOPaint 是一个图像修复工具&#xff0c;使用了先进的AI模型进行图像编辑。以下是其前后端所使用的框架&#xff1a; 前端框架 IOPaint 的前端使用了 Node.js 和 npm 进行依赖管理和构建。具体步骤如下&#xff1a; 克隆仓库并进入 web_app 目录&#x…...

【Linux】进程间通信_2

文章目录 七、进程间通信1. 进程间通信分类管道 未完待续 七、进程间通信 1. 进程间通信分类 管道 管道的四种情况&#xff1a; ①管道内部没有数据&#xff0c;并且具有写端的进程没有关闭写端&#xff0c;读端就要阻塞等待&#xff0c;知道管道pipe内部有数据。 ②管道内部…...

Linux基础 - 常用命令

目录 零. 简介 一 . 常见 Ubuntu 命令 二. apt-get 下载 三. 网络命令 四. 常用命令的总结 零. 简介 在 Ubuntu 中&#xff0c;命令是用于与操作系统进行交互和执行各种操作的指令。通过在终端中输入命令&#xff0c;可以完成文件管理、系统配置、软件安装、进程管理等各种…...

轻松两步,借助向量数据库 VectorDB 与千帆 Appbuilder 构建个性化本地问答知识库

在我们日常的工作和生活中&#xff0c;经常会遇到需要快速获取和管理大量信息的情况。无论是解答客户的问题&#xff0c;还是整理公司内部的资料&#xff0c;一个高效的知识库系统都能帮我们省下大量时间和精力。 为了帮助大家快速构建 RAG 应用&#xff0c;我们之前发布了一个…...

ONLYOFFICE 桌面编辑器 8.1

ONLYOFFICE 桌面编辑器 8.1 ONLYOFFICE 简介一、轻松编辑器 PDF 文件二、用幻灯片版式快速修改幻灯片三、无缝切换文档编辑、审阅和查看模式四、**改进从右至左语言的支持 & 新的本地化选项**五、隐藏“连接到云”板块六、在演示文稿中播放视频和音频文件七、版本 8.1&…...

idea中的git在clone文件提示 filename too long

一 解决版本 1.1 问题描述以及解决办法 当在Windows系统下使用Git时出现“filename too long”错误&#xff1a; git config --system core.longpaths true...

C++ 数组介绍

1. 数组是什么&#xff1f; 在C中&#xff0c;数组是一种基本的数据结构&#xff0c;它允许我们存储固定大小的相同类型元素的集合。每个元素在数组中都有一个唯一的索引&#xff0c;从0开始。 2. 数组的声明与初始化 2.1 声明数组 声明数组时&#xff0c;需要指定数组的类…...

思维导图MindManager2024最新版,让你的思维飞起来!

亲爱的朋友们&#xff0c;今天我要跟大家分享一款我近期深度使用并彻底被种草的神器——MindManager2024最新版本的思维导图软件。作为一位对效率和创意有着极高追求的内容创作者&#xff0c;我几乎尝试过市面上所有的思维导图工具&#xff0c;而MindManager2024无疑是其中的佼…...

Spring容器启动流程——refresh()单个方法分析

文章目录 Spring启动过程this()方法refresh()prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory()postProcessBeanFactory()invokeBeanFactoryPostProcessorsregisterBeanPostProcessorsinitMessageSource()initApplicationEventMulticaster()onRefresh()registerLi…...

Redis--注册中心集群 Cluster 集群

准备工作&#xff1a; 首先pull用到的镜像 docker pull redis:6.0.8 端口准备 node01 192.168.248.189.6381-6382 node02 192.168.248.190 6383-6384 node03 192.168.248.191 6385-6386 创建路径&#xff1a; mkdir -p /soft/docker/redis-cluster cd /soft/docker/re…...

秋招突击——6/20——复习{(单调队列优化)——最大子序列和,背包问题——宠物小精灵收服问题}——新作{两两交换链表中的节点}

文章目录 引言复习单调队列优化——最大子序列和思路分析实现代码参考实现 背包问题——宠物小精灵的收服问题个人实现参考实现 新作两两交换链表中的节点个人实现参考实现 删除有序数组中的重复项个人实现知识补全迭代器的访问和控制vector删除特定的元素erasevector底层删除元…...

使用 MongoDB 剖析开放银行:技术挑战和解决方案

开放银行&#xff08;或开放金融&#xff09;在银行业掀起了一股颠覆性浪潮&#xff0c;它迫使金融机构&#xff08;银行、保险公司、金融科技公司、企业甚至政府机构&#xff09;迎接一个透明、协作和创新的新时代。这种模式转变要求银行与第三方提供商&#xff08;TPP&#x…...

鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二

一、鸿蒙应用界面开发 弹性布局-Flex 语法 /* 弹性容器组件 Flex() 位置&#xff1a; Flex默认主轴水平往右&#xff0c;交叉轴垂直向下&#xff08;类似Row&#xff09; 语法&#xff1a; Flex(参数对象){子组件1,子组件2,子组件3 } 属性方法&#xff1a; direction&#xf…...

26.4 Django 视图层

1. 视图函数 视图函数是Django框架中用于处理Web请求并返回Web响应的重要组件. 以下是对Django视图函数的详细解释: * 1. 视图函数与URL的映射.为了让Django能够知道哪个URL对应哪个视图函数, 需要在应用的urls.py文件中定义URL模式.使用path或re_path函数来定义URL模式, 并将…...

Hbase介绍

Hbase介绍 HBase 是一个开源的、分布式的、面向列的 NoSQL 数据库系统&#xff0c;它建立在 Apache Hadoop 之上&#xff0c;提供了高可靠性、高性能、可伸缩性和高可用性的存储解决方案。让我来简单介绍一下 HBase 的架构。 1. 架构概述&#xff1a; HBase 的架构设计基于 Go…...

rollup学习笔记

一直使用的webpack,最近突然想了解下rollup,就花点时间学习下. 一,什么是rollup? rollup 是一个 JavaScript 模块打包器&#xff0c;可以将小块代码编译成大块复杂的代码,比如我们的es6模块化代码,它就可以进行tree shaking,将无用代码进行清除,打包出精简可运行的代码包. 业…...

多商户零售外卖超市外卖商品系统源码

构建你的数字化零售王国 一、引言&#xff1a;数字化零售的崛起 在数字化浪潮的推动下&#xff0c;零售业务正经历着前所未有的变革。多商户零售外卖超市商品系统源码应运而生&#xff0c;为商户们提供了一个全新的数字化零售解决方案。通过该系统源码&#xff0c;商户们可以…...

HTML 教程

HTML 教程 HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言。它描述了一个网站的结构骨架,使得浏览器能够展示具有特定格式的文本、链接、图片和其他内容。本教程将带你深入了解HTML的基础知识,包括其语法、常用标签以及如何构建一个基本的网页结构。 …...

【仿真建模-解析几何】求有向线段上距指定点最近的坐标

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-25 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 问题描述&#xff1a; 有向线段起点A为&#xff08;x1&#xff0c;y1&#xff09;&#xff0c;终点B为&#xff08;x2&#xff0c;y2&a…...

Linux系统中常用的基本命令

1. 文件与目录管理 ls: 列出目录内容。cd: 切换当前工作目录。pwd: 显示当前工作目录的路径。mkdir: 创建一个新目录。rmdir: 删除空目录。cp: 复制文件或目录。mv: 移动或重命名文件或目录。rm: 删除文件或目录。touch: 创建一个空文件或更新文件时间戳。 2. 文本内容查看 …...

数据结构与算法:回溯算法约束条件:剪枝详解、示例(C#、C++)与回溯典型例题详解

文章目录 一、约束条件二、剪枝三、典型例题四、常用术语五、示例N 皇后问题 C# 示例N 皇后问题 C 示例 六、常见用用回溯算法解决的问题汇总组合问题&#xff1a;图论问题&#xff1a;棋盘游戏问题&#xff1a;优化问题&#xff1a;调度问题&#xff1a;其他问题&#xff1a; …...

利用sortablejs实现拖拽排序

import Sortable from "sortablejs";created() {//禁止火狐拖拽进行搜索document.body.ondrop function(event){event.preventDefault();event.stopPropagation();}}// 打开对话框的时候调用下openCustomDialog(){this.rowDrop()}// 行拖拽 rowDrop() {this.$nextTi…...

超越AnimateAnyone, 华中科大中科大阿里提出Unimate,可以根据单张图片和姿势指导生成视频。

阿里新发布的UniAnimate&#xff0c;与 AnimateAnyone 非常相似&#xff0c;它可以根据单张图片和姿势指导生成视频。项目核心技术是统一视频扩散模型&#xff0c;通过将参考图像和估计视频内容嵌入到共享特征空间&#xff0c;实现外观和动作的同步。 相关链接 项目&#xff1…...