javascript如何实现类_ES6类语法如何使用【教程】

发布时间 - 2026-01-28 00:00:00    点击率:
ES6 的 class 是基于原型的语法糖,不改变继承本质;必须用 class 关键字声明,类体中仅允许方法(含 constructor),属性需用类字段语法(如 age = 25)或 static 声明,私有字段以 # 开头,子类 constructor 中 super() 必须首行调用。

ES6 的 class 不是新引入的“类机制”,而是基于原型的语法糖,它不会改变 JavaScript 的继承本质。直接用 class 声明,比手写 function 构造函数 + prototype 更清晰,但若误以为它像 Java/C++ 那样有真正私有字段或静态类型,就容易踩坑。

如何正确定义一个 ES6 类

必须用 class 关键字声明,且类体中只能写方法(含 constructor),不能写属性赋值(除非用类字段语法,见下文)。

常见错误:在类体内直接写 name = 'foo'(不加 static 或未启用类字段提案)——这会报 SyntaxError: Unexpected token

  • constructor 是可选的,但若省略,系统会自动添加空构造器
  • 所有方法默认不可枚举(Object.keys() 看不到),且自动绑定为非严格模式(但实际运行仍受全局严格模式影响)
  • 类声明不会被提升(ReferenceError),必须先声明后使用
class Person {
  constructor(name) {
    this.name = name;
  }
  say() {
    return `Hi, I'm ${this.name}`;
  }
}

类字段(Class Fields)怎么写才兼容

类字段(如 age = 25)属于 Stage 4 提案,现代浏览器和 Node.js 14+ 支持,但 TypeScript 编译或 Babel 处理时需确认目标环境。

如果不经转译直接跑在旧环境(如 IE、Node.js 12),这类写法会直接报错,而非静默忽略。

  • 实例字段写在类体内顶层,无需 constructor 就能初始化:score = 0
  • 静态字段用 static 前缀:static defaultLevel = 'user'
  • 私有字段(#id)也属同一提案,但目前仅 Chrome/Firefox/Node.js 14+ 支持,且无法被 JSON.stringify 序列化
class Counter {
  count = 0;                    // 实例字段
  static totalCount = 0;         // 静态字段
  #privateId = Math.random();    // 私有字段(注意 # 号)
}

继承时 super() 必须调用的两种场景

子类定义了 constructor 就必须显式调用 super();另外,子类方法中访问 this 前,也必须确保 super() 已执行完毕 —— 否则会抛 ReferenceError: Must call super constructor

  • 如果子类没写 constructor,JS 会自动补一个 constructor(...args) { super(...args); }
  • super() 必须在 this 之前调用,哪怕只是读 this.constructor 也不行
  • super.xxx 可以在任何地方用(包括静态方法),但 super() 只能在实例构造器中用
class Animal {
  constructor(name) {
    this.name = name;
  }
}
class Dog extends Animal {
  constructor(name, breed) {
    super(name);           // 必须第一句
    this.breed = breed;
  }
}

静态方法和 getter/setter 的实际限制

static 方法不能访问 this(因为没有实例上下文),但它可以访问类自身和其他静态成员;而 get/set 本质上是定义在原型上的访问器属性,不是普通方法 —— 所以它们不能被 call/apply 动态调用,也不能被枚举(for...in 看不到)。

  • 静态方法适合工具逻辑(如 Date.parse()),但别试图在其中操作实例状态
  • getter/setter 内部用 this 指向实例,但若在 setter 中修改同名属性(如 set name(v) { this.name = v } ),会无限递归
  • 私有字段的 getter/setter 必须也用 # 前缀,且不能混用公有与私有同名访问器

最易被忽略的一点:类内部的 async 方法、生成器方法(async foo() {}*bar() {})都是合法的,但它们的语法支持依赖运行时 —— 比如 async 类方法在 Node.js 8+ 才可用,别想当然认为所有“看起来像类的地方”都支持。


# javascript  # es6  # java  # js  # node.js  # json  # node  # typescript  # 浏览器  # app  # firefox  # chrome  # Static  # Object  # for  # 子类  # 构造函数  # date  # Token  # 递归  # 继承  # class  # 访问器 


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


相关推荐: 如何在万网自助建站中设置域名及备案?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何为不同团队 ID 动态生成多个“认领值班”按钮  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何正确下载安装西数主机建站助手?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  JS实现鼠标移上去显示图片或微信二维码  北京的网站制作公司有哪些,哪个视频网站最好?  如何注册花生壳免费域名并搭建个人网站?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  利用 Google AI 进行 YouTube 视频 SEO 描述优化  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何在局域网内绑定自建网站域名?  Laravel如何创建自定义Facades?(详细步骤)  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在阿里云购买域名并搭建网站?  网站页面设计需要考虑到这些问题  如何批量查询域名的建站时间记录?  Laravel如何实现API速率限制?(Rate Limiting教程)  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  如何快速选择适合个人网站的云服务器配置?  如何快速搭建FTP站点实现文件共享?  iOS发送验证码倒计时应用  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  微信小程序 wx.uploadFile无法上传解决办法  php json中文编码为null的解决办法  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何快速搭建高效简练网站?  如何用狗爹虚拟主机快速搭建网站?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  装修招标网站设计制作流程,装修招标流程?  如何用好域名打造高点击率的自主建站?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何快速生成橙子建站落地页链接?  如何快速辨别茅台真假?关键步骤解析  魔方云NAT建站如何实现端口转发?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  微信小程序 canvas开发实例及注意事项  微信小程序 配置文件详细介绍  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  非常酷的网站设计制作软件,酷培ai教育官方网站?