new绑定的核心作用是创建并初始化新对象,将其作为this绑定到构造函数内部:创建空对象、设置原型、执行函数体、按规则返回结果;其优先级最高,覆盖其他绑定。

JavaScript 中 new 绑定的核心作用不是“保护”执行环境,而是**创建并初始化一个新对象,并将其作为 this 绑定到构造函数内部,同时确保函数按构造逻辑正确运行**。所谓“保护”,其实是这一机制自然带来的副作用:避免意外修改全局对象、防止普通调用时 this 指向失控、约束返回值行为。
new 绑定如何隔离 this 上下文
当用 new 调用函数时,JS 引擎会自动执行以下步骤:
- 创建一个全新的空对象(即实例),其
[[Prototype]]指向构造函数的prototype - 将该新对象设为构造函数调用时的
this值(严格模式下不会退化为window或global) - 执行构造函数体,所有对
this的属性赋值都落在新实例上 - 若构造函数显式返回一个非空对象,则使用该对象;否则默认返回新创建的实例
这使得构造函数内部的 this 始终指向可控的新对象,与调用位置、是否严格模式、外部绑定(如 call/bind)无关——new 绑定的优先级高于显式绑定和隐式绑定。
为什么它能防止全局污染
不加 new 直接调用构造函数时,this 在非严格模式下指向全局对象(如 window),容易导致意外挂载属性:
立即学习“Java免费学习笔记(深入)”;
function Person(name) {
this.name = name; // 若没用 new,this 指向 window,name 成了全局变量
}
Person('Alice'); // 糟糕:window.name = 'Alice'
而 new Person('Alice') 保证 this 是干净的新对象,不会触碰全局环境。这不是主动“防护”,而是 new 语义本身切断了 this 与外围作用域的关联路径。
返回值规则强化了实例一致性
构造函数的返回值处理有明确约定:
- 返回基本类型(
string/number/boolean等)会被忽略,始终返回新实例 - 仅当返回一个对象(包括数组、函数、正则等)时,才替代默认实例
这一规则防止构造函数意外返回错误上下文(比如误返回 this 以外的对象),也避免因忘记写 return 导致结果为 undefined——只要没显式返回对象,就总有可用实例。这是对构造行为的“兜底保障”,而非运行时校验。
与 call/bind 的优先级关系体现其强制性
即便构造函数已被 bind 预绑定 this,new 仍会覆盖该绑定:
function Foo() { return this; }
const bound = Foo.bind({x: 1});
new bound(); // 返回新实例,不是 {x: 1}
这是因为 new 绑定在 JS 的 this 绑定优先级中最高(高于显式绑定)。这种设计确保构造意图不被外部绑定干扰,是语言层面对“构造行为”的硬性承诺。


















