es6类中new是强制约束而非新增功能,其本质仍是构造函数+原型链语法糖;类必须用new调用,否则抛typeerror;new执行流程与es5构造函数完全一致,包含创建空对象、设置原型链、绑定this并执行constructor、返回实例或显式对象。

new 绑定在 ES6 类中不是“新增功能”,而是强制约束
ES6 的 class 并非新对象模型,它只是构造函数 + 原型链的语法糖。但与普通函数不同,class 必须配合 new 使用——直接调用会抛出 TypeError: Class constructor Person cannot be invoked without 'new'。这是因为类的内部方法 [[Construct]] 被设计为不可被 [[Call]] 直接触发,引擎从底层就禁止了无 new 调用。
new 执行时,类和普通构造函数的流程完全一致
当你写 const p = new Person('Alice', 30),JavaScript 引擎实际执行四步,和 ES5 构造函数一模一样:
- 创建一个空对象
obj = {} - 将
obj.__proto__指向Person.prototype(即建立原型链) - 以
obj为this,调用Person.constructor.apply(obj, ['Alice', 30]) - 若 constructor 显式返回一个对象,则返回它;否则返回
obj
区别只在于:类的 constructor 方法是必须定义的(若省略,引擎自动补空构造器),且它天然具备 [[Construct]] 内部方法,而普通函数需手动满足可构造条件(如不能是箭头函数、不能是 async 函数等)。
静态方法、实例方法、getter/setter 都依赖 this 绑定和原型链
类体中声明的内容,最终都映射到对应的位置:
-
实例方法(如
sayHello())被添加到Person.prototype上,所有实例通过__proto__共享 -
静态方法(如
static create())直接挂载在Person函数对象自身上,不参与原型链 -
getter/setter 也定义在
Person.prototype,访问p.fullInfo实际触发的是原型上的访问器逻辑 -
实例属性(如
this.name = name)在 constructor 中通过绑定后的this写入新对象,属于实例私有
继承中的 new 绑定更严格,且涉及双原型链设置
使用 extends 的子类(如 class Student extends Person)在 new 时会额外处理父类原型链:
- 子类实例的
__proto__→Student.prototype -
Student.prototype.__proto__→Person.prototype(由引擎自动设置,等价于Object.setPrototypeOf(Student.prototype, Person.prototype)) - 子类 constructor 内必须先调用
super(),本质是执行Person.call(this, ...),完成父类实例属性初始化 - 若漏掉
super(),new 会直接报错:ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











