new关键字通过创建空对象、链接原型、绑定this并返回实例四步构建继承链;子类原型须用new parent()而非直接赋parent.prototype以保障隔离性;es6 class底层仍依赖new和原型链机制。

在继承关系中使用 new 关键字,本质是构建实例对象并建立原型链的关键动作。它不是简单“复制”父类,而是通过隐式链接把新对象挂到父类的原型上,从而实现属性和方法的可访问性。
new 创建实例时的四步核心操作
当用 new Parent() 实例化一个构造函数(尤其作为父类被子类继承时),JavaScript 引擎内部执行:
- 创建一个空对象(即未来实例)
- 将该空对象的
__proto__指向Parent.prototype - 以这个空对象为
this,调用Parent函数,初始化自有属性(如this.name) - 若构造函数未显式返回对象,则自动返回该新对象;否则返回构造函数返回的对象(此时原型链断裂)
原型链如何在继承中被串联起来
继承能否生效,关键看子类原型是否正确指向父类实例。常见做法是:
-
Child.prototype = new Parent()—— 这一步让Child.prototype.__proto__指向Parent.prototype - 补回
constructor:因为new Parent()覆盖了Child.prototype.constructor,需手动修复:Child.prototype.constructor = Child - 这样,
new Child()得到的实例,其__proto__→Child.prototype→__proto__→Parent.prototype→__proto__→Object.prototype→null
为什么不能直接赋值 Child.prototype = Parent.prototype
这种写法看似省事,但会破坏继承隔离性:
- 子类原型与父类原型共用同一对象,修改
Child.prototype.xxx会直接影响Parent.prototype - 所有
Parent实例也会意外获得子类添加的方法,违背封装原则 - 无法在子类原型上独立定义专属方法,失去继承的灵活性
ES6 class 继承背后的 new 逻辑
虽然 class extends 语法更简洁,但它底层仍依赖 new 和原型链:
-
super()在子类构造器中,本质是调用Parent.call(this, ...),完成属性初始化 - 类声明自动设置
Child.prototype.__proto__ = Parent.prototype(V8 等引擎优化实现,语义等价于Object.setPrototypeOf(Child.prototype, Parent.prototype)) - 因此
new Child()的实例既能访问自身属性,也能沿原型链找到Parent.prototype上的方法











