与函数类型相似,定义类也有两种主要方式:类声明和类表达式,这两种方式都使用class关键字加大括号

与函数表达式类似,类表达式在它们被求值前也不能引用,不过与函数定义不同的是,虽然函数声明可以提升,但类定义不能,函数受函数作用域限制,而类受块作用域限制

类可以包含构造函数方法、实例方法、获取函数、 设置函数和静态类方法,但这些都不是必须的,空的类定义照样有效,默认情况下,类定义中的代码都在严格模式下执行

类表达式的名称是可选的,在把类表达式赋值给变量后,可以通过name属性取得类表达式的名称字符串,但不能在类表达式作用域外部访问这个标识符


constructor关键字用于在类定义块内部创建类的构造函数,方法名constructor会告诉解释器在使用new操作符创建类的新实例时,应该调用这个函数。构造函数的定义不是必须的,不定义构造函数相当于将构造函数定义为空函数

使用new操作符实例化操作等于使用new调用其构造函数,唯一可感知的不同之处是,JS解释器知道使用new和类意味着应该使用constructor函数进行实例化。

使用new调用类的构造函数会执行如下操作:

  • 在内存中创建一个新对象
  • 这个新对象内部的[[Prototype]]指针被赋值为构造函数的prototype属性
  • 构造函数内部的this被赋值为这个新对象
  • 执行构造函数内部的代码
  • 如果构造函数返回非空对象,则返回该对象,否则,返回刚创建的新对象

类实例化时传入的参数会用作构造函数的参数,如果不需要参数,则类名后面的括号也是可选的

默认情况下,类构造函数会在执行之后返回this对象,构造函数返回的对象会被用作实例化的对象,如果没有什么引用新创建的this对象,那么这个对象会被销毁。如果返回的不是this对象,而是其他对象,那么这个对象不会通过instanceof操作符检测出跟类有关联,因为这个对象的原型指针并没有被修改

类构造函数与构造函数的主要区别是,调用类构造函数必须使用new操作符,而普通构造函数如果不使用new调用,那么就会以全局的this作为内部对象,调用类构造函数时如果忘了使用new则会抛出错误

类构造函数没有什么特殊之处,实例化之后,他会成为普通的实例方法,因此,实例化之后可以在实例上引用它,但作为类构造函数,依然要使用new调用

ES类就是一种特殊函数,类标识符有prototype属性,而这个原型也有一个constructor属性指向类自身

与普通构造函数一样,可以使用instanceof操作符检查构造函数原型是否存在于实例的原型链中

类本身具有与普通构造函数一样的行为,在类的上下文中,类本身在使用new调用时就会被当成构造函数,类中定义的constructor方法不会被当成构造函数,在对它使用instanceof操作符时会返回false,但是,如果在创建实例时直接将类构造函数当成普通构造函数来使用,那么instanceof操作符的返回值会反转

类是JS一等公民,因此可以像其他对象或函数引用一样把类作为参数传递

与立即调用函数表达式类似,类也可以立即实例化


通过new调用类标识符时,都会执行类构造函数,在这个函数内部,可以为新创建的实例添加自有属性,至于添加什么样的属性,则没有限制。另外,在构造函数执行完毕后,仍然可以给实例继续添加新成员

每个实例都对应一个唯一的成员对象,这意味着所有成员都不会在原型上共享

为了在实例间共享方法,类定义语法把在类块中定义的方法作为原型方法。可以把方法定义在类构造函数中或者类块中,但不能在类块中给原型添加原始值或对象作为成员数据

类方法等同于对象属性,因此可以使用字符串、符号或计算的值作为键,类定义也支持获取和设置访问器,语法与行为跟普通对象一样

可以在类上定义静态方法,这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例。与原型成员类似,静态成员每个类上只能有一个,静态类方法非常适合作为实例工厂

静态类成员在类定义中使用static关键字作为前缀,在静态成员中,this引用类自身,其他所有约定跟原型成员一样

虽然类定义并不显式支持在原型或类上添加成员数据,但在类定义外部,可以手动添加

类定义语法支持在原型和类本身上定义生成器方法,因为支持生成器方法,所以可以通过添加一个默认的迭代器,把类实例变成可迭代对象


ES6类支持单继承,使用extends关键字,就可以继承任何拥有[[Constructor]]和原型的对象,很大程度上,这意味着不仅可以继承一个类,也可以继承普通的构造函数。派生类都会通过原型链访问到类和原型上定义的方法,this的值会反映调用相应方法的实例或者类

派生类的方法可以通过super关键字引用它们的原型,这个关键字只能在派生类中使用,而且仅限于类构造函数、实例方法和静态方法内部。在类构造函数中使用super可以调用父类构造函数

在静态方法中可以通过super调用继承的类上定义的静态方法

ES6给类构造函数和静态方法添加了内部特性[[HomeObject]],这个特性是一个指针,指向定义该方法的对象,这个指针是自动赋值的,而且只能在JS引擎内部访问。super始终会定义为[[HomeObject]]的原型

在使用super时要注意几个问题:

  • super只能在派生类构造函数和静态方法中使用
  • 不能单独引用super关键字,要么用它调用构造函数,要么用它引用静态方法
  • 调用super会调用父类构造函数,并将返回的实例赋值给this
  • super的行为如同调用构造函数,如果需要给父类构造函数传参,则需要手动传入
  • 如果没有定义类构造函数,在实例化派生类时会调用super,而且会传入所有传给派生类的参数
  • 在类构造函数中,不能在调用super之前引用this
  • 如果在派生类中显示定义了构造函数,则要么必须在其中调用super,要么必须在其中返回一个对象

有时候可能需要定义这样一个类,它可供其他类继承,但本身不会被实例化。可以通过new.target实现,new.target保存通过new关键字调用的类或函数,通过在实例化时检测new.target是不是抽象基类,可以阻止对抽象基类的实例化

通过在抽象基类构造函数中进行检查,可以要求派生类必须定义某个方法,因为原型方法在调用类构造函数之前就已经存在了,所以可以通过this关键字来检查相应的方法

ES6类为继承内置引用类型提供了顺畅的机制,开发者可以方便的扩展内置类型

有些内置类型的方法,会返回新实例,默认情况下,返回实例的类型与原始实例的类型是一致的,如果想覆盖这个默认行为,则可以覆盖Symbol.species访问器,这个访问器决定在创建返回的实例时使用的类

把不同类的行为集中到一个类是一种常见的JS模式,extends关键字后面是一个JS表达式,任何可以解析为一个类或一个构造函数的表达式都是有效的,这个表达式会在求值类定义时被求值。混入模式可以通过在一个表达式中连缀多个混入元素来实现,这个表达式最终会解析为一个可以被继承的类。可以定义一组可嵌套的函数,每个函数分别接收一个超类作为参数,而将混入类定义为这个参数的子类,并返回这个类,这些组合函数连缀调用,最终组合成超类表达式

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

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

相关文章

专题:2025游戏科技与市场趋势报告|附130+份报告PDF汇总下载

原文链接:https://tecdat.cn/?p42733 2024年全球游戏市场规模突破1877亿美元,中国以37.5%的全球占比成为核心增长引擎。生成式AI以52%的企业采用率重塑开发流程,混合休闲游戏实现37%的收入增长,跨端互通产品贡献42%增量。玩家行为…

【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

目录 一、问题描述二、场景还原1. 测试mapper2. 测试service 三、原因分析四、解决方案1. DemoApplicationTests2. DemoApplication 后记 一、问题描述 在Application文件中加了ComponentScan注解,此后运行任何测试方法均报错 java.lang.IllegalStateException: Fa…

Ubuntu 和 CentOS 中配置静态 IP

在 Ubuntu 和 CentOS 中配置静态 IP 的方法有所不同,主要因为两者使用的网络管理工具不同。以下是详细步骤: Ubuntu(18.04 及更新版本,使用 netplan) 1. 查看网卡名称 ip a记录网卡名称(如 ens33、eth0&a…

4、做中学 | 二年级下期 Golang整型和浮点型

上篇介绍了哪些数据类型,如何进行声明常量和变量,那么接下来进行详细学习下各个数据类型的使用! 一、整数 在go中,整数分为俩类,一个是无符号整数,即0以上数值;另一个是有符号数值,…

C++11 GC Interface:从入门到精通

文章目录 一、引言二、C11简介2.1 C11发展历史2.2 C11新特性概述 三、C11中的垃圾收集支持和基于可达性的泄漏检测3.1 背景与原理3.2 相关标准与接口3.3 示例代码 四、C11 GC interface的使用场景4.1 简化内存管理4.2 提高代码可靠性 五、C23中移除垃圾收集支持和基于可达性的泄…

《高并发系统性能优化三板斧:缓存 + 异步 + 限流》

高并发系统性能优化三板斧:缓存 异步 限流 引言 在互联网应用的高并发场景下,系统性能面临巨大挑战。以某电商平台会员活动为例,活动期间瞬时QPS可达10万,若未进行有效优化,服务器将迅速崩溃。本文从缓存、异步、限…

JVM(4)——引用类型

痛点引入: 为什么需要不同的引用类型?直接只用强引用不行吗?(内存泄漏风险、缓存管理粗粒度、对象生命周期监听需求) 核心作用: 解释引用类型如何让程序员与垃圾收集器(GC)协作&…

ONLYOFFICE 文档 9.0 版本已发布:新界面、图表查看器、.md 文件支持、AI 表格与宏等更新

ONLYOFFICE 文档 9.0 版本已正式发布。此次更新包含 20 多项新功能和约 500 项修复,全面提升您的办公效率。从全新界面、突破性的 AI 工具到更广泛的文件格式兼容性,本次发布将带来更加流畅的使用体验。阅读本文,了解详情。 更新全部编辑器的…

关于python-socket服务的问题记录

概述 在使用pythonwebsocket部署socket服务,前端使用小程序来连接,过程中存在以下可能出现的问题: 1,代码里socket端口问题2,服务器配置问题(域名解析?Nginx配置是否正确处理了WebSocket升级头…

typescript vs go vs rust

typescript 后端选型: Express &Typescript &trpc 广泛使用,灵活,快速,稳定 Nestjs 企业级,标准化,像java ,依赖注入, Hono , web standards framework. Support for any J…

OpenGL和OpenGL ES区别

OpenGL(Open Graphics Library)和OpenGL ES(OpenGL for Embedded Systems)都是用于图形渲染的API,但它们的目标平台和设计定位有所不同。 1. 目标平台 OpenGL 主要用于桌面平台(如Windows、macOS、Linux&a…

PyTorch 入门之官方文档学习笔记(一)

目录 1 张量 1)张量的初始化和属性 2)张量操作 3)使用 NumPy 进行桥接 2 torch.autograd 1)背景 2)在 PyTorch 中的使用 3)Autograd 的微分机制 4)计算图原理 5)从计算图中…

King’s LIMS 系统引领汽车检测实验室数字化转型

随着汽车保有量的持续攀升和车龄的增长,消费者对汽车的需求已悄然转变,从最初对外观和性能的追求,逐渐深化为对安全性、可靠性、耐久性、性能与舒适性以及智能化功能的全方位关注。这无疑让汽车检测行业在保障车辆质量、满足市场需求方面肩负…

Neo4j常见语句-merge

merge用法&#xff1a;MERGE 是 Neo4j 中一个强大的操作符&#xff0c;用于确保图中存在特定的节点或关系。它的核心逻辑是&#xff1a;如果目标存在则匹配&#xff0c;不存在则创建 基本语法与逻辑&#xff1a; MERGE <pattern> [ON CREATE <create_clause>] //…

Mem0多级记忆实现机制详解

在人工智能交互场景中,记忆能力是实现个性化服务与智能决策的关键。Mem0 通过设计分层记忆架构,实现了对用户、会话和智能体状态的多级管理。各层级记忆既相互独立存储,又通过精密的关联机制协同运作,确保在不同场景下都能提供精准的上下文支持,显著提升 AI 交互的智能性与…

Python 爬虫入门 Day 5 - 使用 XPath 进行网页解析(lxml + XPath)

Python 第二阶段 - 爬虫入门 &#x1f3af; 今日目标 掌握 XPath 的基本语法使用 lxml.etree 解析 HTML&#xff0c;提取数据与 BeautifulSoup 比较&#xff1a;谁更强&#xff1f; &#x1f4d8; 学习内容详解 ✅ 安装依赖 pip install lxml&#x1f9e9; XPath 简介 XPa…

变幻莫测:CoreData 中 Transformable 类型面面俱到(六)

概述 各位似秃似不秃小码农们都知道&#xff0c;在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过&#xff0c;大家是否知道在 CoreData 中还存在一个 Transfo…

Vuex(一) —— 集中式的状态管理仓库

目录 Vue组件间通信方式回顾 组件内的状态管理流程组件间通信方式 父组件给子组件传值 (最简单的一种方式)子组件给父组件传值不相关组件之间传值其他常见方式($ref) 简易的状态管理方案 上面组件间通信方式的问题集中式的状态管理方案 Vuex 什么是Vuex?什么情况下使用Vuex?…

操作系统---内存管理上

文章目录 1. 内存的基础知识1.1 什么是内存&#xff0c;有何作用1.2 进程运行的基本原理1.2.1 指令的工作原理1.2.2 逻辑地址 VS 物理地址 1.3 如何实现地址转换&#xff08;逻辑 -> 物理&#xff09;1.3.1 绝对装入1.3.2 可重定位装入&#xff08;静态重定位&#xff09;1.…

医学图像处理期末复习

目录 考试范围第1章 绪论1.1 数字图像处理的概念1.2 数字图像处理的应用领域1、医学领域2、其他领域 1.3 数字图像处理基础1.4 数字图像基础运算 第2章 医学图像灰度变换与空间滤波2.1 医学图像灰度变换线性灰度变换非线性灰度变换 2.2 直方图均衡化√2.3 空间平滑滤波线性空间…