new调用构造函数时创建新对象并将其[[Prototype]]指向构造函数的prototype;子类必须调用super()初始化this,否则抛出ReferenceError;箭头函数无prototype,不可new调用。

当使用 new 调用一个构造函数时,JavaScript 会创建新对象,并将其 [[Prototype]] 指向该函数的 prototype 属性。在继承结构中(如通过 class 或 Object.setPrototypeOf 建立的原型链),new 绑定仍遵循这一规则,但需注意构造函数自身的 prototype 是否被正确设置,以及子类是否调用 super()。
子类构造函数必须显式调用 super()
ES6 类继承中,子类构造函数若不调用 super(),则无法访问 this,会直接抛出 ReferenceError。这是因为 super() 不仅执行父类构造逻辑,还负责初始化内部绑定的 this(即为新实例赋予正确的原型链起点)。
-
super()内部会调用父类构造函数,并将新对象作为this绑定进去 - 若跳过
super(),子类构造函数中的this尚未被初始化,任何访问都会报错 - 即使父类没有显式构造函数,
super()仍需调用,否则语法错误
new 绑定与原型链的实际连接点
new 的核心行为是:创建空对象 → 设置其 [[Prototype]] 为构造函数的 prototype → 执行构造函数(this 指向该对象)。在继承中,关键在于每个类的 prototype 是否指向正确的上层原型。
- 子类的
prototype.[[Prototype]]自动设为父类的prototype(由extends保证) - 新实例的
[[Prototype]]是子类的prototype,因此能沿链向上查找方法 - 可通过
Object.getPrototypeOf(instance) === Sub.prototype和Object.getPrototypeOf(Sub.prototype) === Super.prototype验证链是否完整
手动继承时 prototype 链易被破坏
若不用 class 而用函数+原型模拟继承(如 Child.prototype = Object.create(Parent.prototype)),必须手动修复 constructor 并确保 new 绑定不丢失原型链。
立即学习“Java免费学习笔记(深入)”;
- 忘记设置
Child.prototype.constructor = Child不影响new行为,但会影响instance.constructor的准确性 - 若用
Child.prototype = new Parent()替代Object.create,可能触发父类副作用(如初始化状态),且父实例属性会污染所有子类实例 - 推荐始终用
Object.setPrototypeOf(Child.prototype, Parent.prototype)或 ES6 的extends保持语义清晰
箭头函数和普通函数对 new 绑定的影响
箭头函数没有自己的 prototype,不能用 new 调用;而普通函数即使作为子类方法存在,只要被 new 直接调用,就会触发标准绑定流程——但前提是它被设计为构造函数(即有可写的 prototype)。
- 类中的方法(包括 getter/setter、静态方法)默认不可被
new,因为它们不是构造函数 - 若把子类方法赋值给变量后
new调用(如const f = Sub.prototype.method; new f()),会失败,因为该方法没有prototype - 只有显式声明为构造函数(函数声明/表达式 + 正确
prototype)才能参与new绑定


















