javascript中的类如何定义和使用?_探索javascript ES6类语法【教程】

8次阅读

javaScript 的 class构造函数的语法糖,基于原型链,需用 new 调用;定义需 constructor,方法直接声明,静态方法加 Static继承用 extends 和 super(),子类 constructor 必须首行调用 super()。

javascript中的类如何定义和使用?_探索javascript ES6类语法【教程】

javascript 中的 class 不是传统面向对象语言里的“类”,它只是构造函数的语法糖,底层仍基于原型链。直接用 class 定义不会改变继承本质,但写法更清晰、约束更强(比如必须用 new 调用,否则报 TypeError: Class constructor X cannot be invoked without 'new')。

如何定义一个基础 class

class 关键字 + 类名 + 花括号,内部至少需一个 constructor 方法(不写会自动生成空构造器):

class Person {   constructor(name, age) {     this.name = name;     this.age = age;   } }

注意:constructor 是唯一能用于初始化实例属性的方法;类体中不能写变量声明或表达式语句(比如 let x = 1console.log()),否则报 Unexpected Token

如何添加方法和静态成员

方法直接写在类体内,不加 function 关键字;静态方法用 static 前缀,只能通过类名调用:

立即学习Java免费学习笔记(深入)”;

  • 实例方法(如 sayHello)会被添加到 Person.prototype
  • 静态方法(如 createAdmin)挂载在 Person 函数本身上,不可被实例访问
  • 字段声明(如 level = 1)属于 ES2022 提案,需确保运行环境支持(node.js ≥16.0 或现代浏览器),否则会报 Unexpected token
class User {   level = 1; // 公共字段(非静态)   constructor(name) {     this.name = name;   }   greet() {     return `Hi, ${this.name}`;   }   static createAdmin() {     return new User('admin');   } }

如何实现继承:extends 和 super 的配合

子类必须在 constructor 中第一行调用 super(),否则报 ReferenceError: Must call super constructor in derived class before accessing 'this'。这是因为子类实例的 this 依赖父类构造器初始化:

  • super() 用于调用父类构造器,传参要匹配父类 constructor 参数
  • super.xxx 可访问父类的原型方法或静态属性(但不能在 constructor 外部单独写 super()
  • 子类若没写 constructor,会自动补上 constructor(...args) { super(...args); }
class Admin extends User {   constructor(name, role) {     super(name); // 必须!     this.role = role;   }   info() {     return `${super.greet()} (${this.role})`;   } }

常见陷阱与兼容性提醒

class 声明不会被提升(hoist),必须先定义后使用,否则报 ReferenceError;而函数声明会提升。另外,class 内部默认启用严格模式,所以 this 不会自动绑定到全局对象——这点在事件回调或定时器里容易出错,需手动 bind 或用箭头函数。

如果需要兼容旧环境(如 IE),得用 Babel 编译成构造函数形式;且注意:Babel 对私有字段(#private)的转换是模拟实现,行为与原生不完全一致。

text=ZqhQzanResources