new绑定仅发生在顶层new表达式中,子类构造函数内调用parent.call(this)不触发new绑定;属性继承靠call,原型继承靠prototype链显式设置。

在父类调用中,new 绑定不是“自动传递”的,而是由每次 new 调用独立触发的四步过程。子类构造函数里调用 Parent.call(this, ...) 并不触发 new 绑定;真正建立原型链、设置 __proto__、返回实例的,只发生在 new Child() 这一刻——它只作用于 Child 构造函数,与父类内部如何被调用无关。
new 绑定只发生在顶层 new 表达式上
当你写 const inst = new Child(),引擎执行的是:
- 创建空对象
inst - 设置
inst.__proto__ = Child.prototype - 以
inst为this执行Child函数体 - 若
Child没有显式返回对象,就返回inst
这个过程完全不涉及 Parent 的 new 绑定。哪怕 Child 内部写了 new Parent(),那也只是另一次独立的 new 调用,生成的是另一个对象,和当前实例无关。
父类属性初始化靠 call/apply,不靠 new
子类想复用父类的初始化逻辑(比如给 this.name 赋值),标准做法是:
-
Parent.call(this, name)—— 把父类函数当普通函数执行,this指向当前子类实例 - 此时
Parent内部的this.name = name直接写到子类实例上 - 这一步没有 new 绑定,不创建新对象,也不改
__proto__
换句话说:属性继承靠 call,原型继承靠 prototype 链接,两者分工明确。
原型链的建立必须显式设置
仅靠 Parent.call(this) 不会让子类实例能访问 Parent.prototype 上的方法。要实现方法继承,必须额外做两件事:
- 让
Child.prototype.__proto__ = Parent.prototype(ES6 前常用Object.create(Parent.prototype)) - 修复
constructor指针:Child.prototype.constructor = Child
这个原型链接动作,和 new 本身无关,是开发者手动或通过 class 语法隐式完成的。而 new Child() 只负责把最终实例的 __proto__ 指向 Child.prototype——之后靠已建立的原型链向上查找。
ES6 class 底层仍是这套机制
写 class Child extends Parent 看似简洁,但编译后依然依赖:
-
new触发子类实例创建和Child.prototype关联 -
super()实质是Parent.call(this, ...),完成自有属性初始化 - 引擎自动设置
Child.prototype.__proto__ = Parent.prototype
所以,父类调用中的 new 绑定并不存在;真正起作用的,是顶层 new 的四步操作 + 子类对父类构造逻辑的显式复用 + 原型链的手动(或自动)搭建。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











