javascript中类是什么_如何使用ES6类语法【教程】

9次阅读

javaScript 的 classfunction 和原型继承的语法糖,基于原型而非传统类;声明不提升,处于暂时性死区;子类 constructor 必须先调 super() 才能用 this;方法不可枚举;静态方法挂载类本身;类字段是实例属性,不共享。

javascript中类是什么_如何使用ES6类语法【教程】

javascript 中的 class 不是新的对象创建机制,而是 function 和原型继承的语法糖——它背后仍是基于原型(prototype)的,不是传统面向对象语言中的“类”。直接用它写业务没问题,但若不理解底层,遇到 ReferenceErrorthis 绑定异常或继承行为不符预期时会卡住。

class 声明不会被提升,必须先定义后使用

function 声明不同,class 是「暂时性死区」(TDZ)的一部分。在声明前访问会抛出 ReferenceError,哪怕只是 typeof 也不行。

  • new MyClass() 放在 class MyClass { ... } 上方 → 报错 ReferenceError: Cannot access 'MyClass' before initialization
  • typeof MyClass 同样报错;而 typeof functionName 在函数声明前是 "function"
  • 如果需要前置调用,改用 const MyClass = class { ... }(类表达式),它和 const 一样遵循块级作用域规则,但也不会被提升

constructor 中的 this 指向新实例,但必须显式调用 super() 才能访问 this

在子类 constructor 中,不调用 super() 就用 this,会立即报 ReferenceError: Must call super constructor in derived class before accessing 'this'

  • 即使子类没写 constructorjs 也会自动补一个隐式的 constructor(...args) { super(...args); }
  • super() 必须在 this 之前调用,且传参需匹配父类 constructor 签名,否则父类初始化失败
  • 若父类 constructor 返回一个对象(非常规操作),this 会被替换为那个返回值——这种写法极少见,但会影响子类逻辑

方法默认不可枚举,且无法被 for…in 遍历

class 内部定义的方法(包括 constructor、普通方法、getter/setter)都会被设置为 enumerable: false,这是与字面量对象的关键区别

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

  • Object.keys(MyClass.prototype) 返回空数组;而 Object.getOwnPropertyNames(MyClass.prototype) 能拿到方法名
  • 静态方法(Static method())挂载在类本身上,MyClass.method() 可调,但 instance.method() 不可调
  • 箭头函数不能用作类方法:写成 method = () => {} 是类字段(class field),属于实例属性,每次 new 都新建函数,不共享,且无法被子类 super.method() 调用

真正容易被忽略的是:class 的静态属性(如 MyClass.prop = 1)和原型属性(如 MyClass.prototype.prop = 1)依然可以手动添加,但这类写法破坏封装性,也绕过了 class 的语义边界。当需要动态扩展行为时,优先考虑组合或装饰器模式,而不是在运行时修补原型。

text=ZqhQzanResources