javaScript类是构造函数的语法糖,基于原型链实现;类声明不提升,方法不可枚举且自动严格模式;constructor非构造函数本身,而是new触发后自动调用的初始化方法。

javascript 类定义用 class 关键字,本质是构造函数的语法糖
es6 的 class 不是全新机制,底层仍基于原型链和函数对象。当你写 class Person { constructor(name) { this.name = name; } },js 引擎实际会生成一个带 constructor 属性的函数,并把方法挂到 Person.prototype 上。
关键区别在于:类声明不会被提升(ReferenceError),而函数声明会被提升;类内部所有方法默认是不可枚举的,且严格模式下自动启用。
constructor 是类中唯一必需的方法,但不是“构造函数”本身
很多人误以为 constructor 就是传统意义上的“构造函数”,其实它只是类初始化时自动调用的特殊方法。真正的构造行为由 new 操作符触发,它会:
- 创建一个空对象,绑定
this到该对象 - 执行
constructor中的代码 - 返回该对象(除非显式返回另一个对象)
如果省略 constructor,JS 会自动插入一个空的:
constructor() {}
立即学习“Java免费学习笔记(深入)”;
注意:constructor 不能是箭头函数,也不能用 return 返回原始值(如 return 42),否则会报 TypeError: Class constructor cannot be invoked without 'new'。
类中定义方法不加 function 关键字,且不能用 var/let/const 声明
这是初学者最常出错的地方。类体中只允许出现:
-
constructor方法 - 普通方法(如
sayHello() { ... }) - getter/setter(如
get age() { return this._age; }) - 静态方法(用
Static修饰) - 公有字段(ES2022+,如
name = 'default';)
以下写法全部非法:
class Bad { function say() {} // ❌ 语法错误 const x = 1; // ❌ 语法错误 var y = 2; // ❌ 语法错误 #private = 3; // ✅ 私有字段(需用 #) }
方法名不能叫 constructor(除构造器本身外),也不能与已有属性同名导致覆盖。
继承时 super() 必须在 this 之前调用
子类构造器中若使用 this,必须先调用 super()。否则会报 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。
super() 的作用是调用父类 constructor,完成父类实例初始化。它等价于 ParentClass.prototype.constructor.call(this, ...args)。
常见错误场景:
- 忘记写
super()—— 直接报错 - 在
super()前访问this—— 报错 -
super()传参错误(比如父类需要参数却没传)—— 运行时逻辑异常,但不报语法错
示例:
class Animal { constructor(name) { this.name = name; } } class Dog extends Animal { constructor(name, breed) { super(name); // ✅ 必须第一行 this.breed = breed; } }
类的继承链条最终指向 Object,但你不能直接 extends NULL(会报 SyntaxError),除非用函数方式手动设置原型。