new绑定严格按四步执行:创建空对象、设置原型链、绑定并执行构造函数、决定返回值;其优先级最高,因在函数执行前就硬性指定this,覆盖bind/call/apply;返回原始值则忽略,返回对象则直接返回;箭头函数无prototype且无this,故不可new。

new 绑定的四步执行流程
当你写 new Person('Alice') 时,JavaScript 引擎不是简单地“换了个 this”,而是严格按顺序完成四个不可跳过的底层操作:
-
创建空对象:引擎内部生成一个干净的普通对象(
{}),它尚未关联任何原型,也不含任何属性。 -
设置原型链:将该空对象的
[[Prototype]](可通过__proto__访问)指向构造函数Person.prototype。这一步让新对象能继承并调用原型上的方法。 -
绑定并执行构造函数:以这个新对象为
this,调用Person函数体(等价于Person.call(newObj, 'Alice'))。所有对this.xxx = xxx的赋值,都直接写入该对象。 -
决定最终返回值:检查构造函数的返回值。若返回的是非
null的对象(包括数组、函数、正则、日期等引用类型),就直接返回它;否则忽略返回值,返回步骤一创建的那个新对象。
为什么 new 绑定优先级最高
它在函数执行前就完成了 this 的硬性指定,后续任何其他绑定方式都无法覆盖:
- 即使函数已用
bind(obj)永久绑定,再用new调用,this仍会重置为新实例,而不是bind时传入的obj。 -
call或apply在new场景下完全失效——因为this已被引擎提前锁定。 - 这种“早介入”机制使
new成为所有this绑定规则中优先级最高的。
构造函数返回值的影响
返回值不是可有可无的细节,它直接影响 new 表达式的最终结果:
- 返回原始值(
string、number、boolean、null、undefined)或不返回:一律忽略,返回新创建的实例对象。 - 返回对象(含
{}、[]、/reg/、new Date()等):直接返回该对象,原实例被丢弃。 -
return this;是冗余写法,默认就返回它;而return {};则会切断原型链,得到一个与构造函数无关的纯对象。
箭头函数为何不能参与 new 绑定
这不是限制,而是由设计决定的底层缺失:
立即学习“Java免费学习笔记(深入)”;
- 箭头函数没有自己的
this,也不具备prototype属性。 -
new依赖函数必须拥有可设置的prototype来建立原型链,而箭头函数连这个属性都没有。 - 一旦尝试
new (() => {}),运行时立即抛出TypeError: xxx is not a constructor,表明它根本不被识别为构造器。


















