javascript ES6的类(class)如何使用?【教程】

发布时间 - 2026-02-01 00:00:00    点击率:
ES6的class是语法糖,基于原型继承;用class声明、constructor初始化;不提升;需用extends和super()实现继承;私有成员用#前缀;类字段在super()后初始化。

ES6 的 class 不是新对象模型,只是语法糖——它背后仍是基于原型的继承,不能替代对 prototype 和构造函数的理解。

如何定义一个基础类?

class 关键字声明,内部用 constructor 定义初始化逻辑。注意:类声明不会被提升(hoisted),必须先声明后使用。

常见错误:ReferenceError: Cannot access 'MyClass' before initialization —— 就是因为把它当成了 function 声明来用了。

  • constructor 是可选的;没写时会默认提供一个空构造函数
  • 类体中只能写方法(含 get/set)、静态方法(static)和字段(public 或 #private),不能写语句或表达式
  • 类名在类内部可通过 constructor.name 获取,但不能直接用类名递归调用自身(比如在 constructor 里写 new MyClass() 会报错,除非类名已存在且在作用域外)

怎么实现继承?extendssuper() 必须一起用

子类构造函数中若定义了 constructor,就必须显式调用 super(),否则会报 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

原因:super() 负责初始化 this,不调就无法访问实例属性。

  • super() 必须在 this 之前调用,哪怕只调一次
  • super 也可作为对象调用父类方法:super.methodName()
  • 静态方法也能被 extends 继承,但需通过 super 在子类静态方法中调用父类静态方法

私有字段和方法怎么写?用 # 前缀,不是 private 关键字

ES6 没有 private 关键字;真正的私有成员必须以 # 开头,且只能在类内部访问。试图从外部读写 obj.#field 会直接报 SyntaxErrorTypeError

注意:# 字段不可枚举、不可代理、不可反射(Reflect.ownKeys() 不返回它们),也不参与 JSON.stringify()

  • 私有方法也必须用 # 前缀,且只能被同个类内的其他方法调用
  • 不能用字符串拼接绕过:比如 this['#' + 'name'] 无效
  • 私有字段名必须在类定义时就确定,不能动态生成(#[key] 不合法)

类字段(class fields)的陷阱:不在 constructor 里初始化时,顺序很重要

类字段(如 value = 123)会在 constructor 执行前初始化,但它们的执行顺序是自上而下——如果字段依赖尚未声明的变量,就会报 ReferenceError

例如:foo = this.bar(); bar() { return 'ok'; } 是合法的;但 foo = this.baz; baz = 'ok'; 会出错,因为 baz 还未赋值。

  • 字段初始化表达式中可以调用方法,但不能引用尚未声明的字段
  • 字段初始化发生在 super() 之后、constructor 函数体之前
  • 如果同时有 constructor 和字段初始化,建议把复杂逻辑收进 constructor,避免隐式执行顺序问题

真正容易被忽略的是:类不是“类型系统”,TypeScript 的 class 会编译成 ES6 类,但 JavaScript 运行时根本不检查类型;所有 instanceoftypeof、原型链操作,都还是原来那套。别指望 class 自动带来封装或类型安

全。


# javascript  # es6  # java  # js  # json  # typescript  # access  # 作用域  # Static  # 封装  # 父类  # 子类  # 构造函数  # 字符串  # 递归  # 继承  # class  # public  # private  # function  # 对象  # typeof  # constructor  # this  # prototype 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何用腾讯建站主机快速创建免费网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  网站图片在线制作软件,怎么在图片上做链接?  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel如何升级到最新版本?(升级指南和步骤)  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在建站主机中优化服务器配置?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何用PHP快速搭建CMS系统?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何在建站宝盒中设置产品搜索功能?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  php结合redis实现高并发下的抢购、秒杀功能的实例  JavaScript如何实现错误处理_try...catch如何捕获异常?  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何为API生成Swagger或OpenAPI文档  高防服务器租用指南:配置选择与快速部署攻略  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  微信小程序 闭包写法详细介绍  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  JavaScript模板引擎Template.js使用详解  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  怎样使用JSON进行数据交换_它有什么限制  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel怎么上传文件_Laravel图片上传及存储配置  怎么用AI帮你设计一套个性化的手机App图标?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  北京企业网站设计制作公司,北京铁路集团官方网站?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?