new 是构造实例的过程,call 是普通函数的上下文重绑定;new 创建新对象、设置原型链、绑定this并执行构造函数,返回新实例或显式对象;call 仅临时指定this并执行函数,不创建对象、不修改原型链。

new 绑定和 call 调用看似都涉及函数执行与 this 控制,但底层逻辑完全不同——一个是构造实例的过程,另一个是普通函数的上下文重绑定。
new 是创建新对象并初始化的完整生命周期
new 不只是改 this,它触发一套不可跳过的构造流程:
- 创建一个全新的空对象(
{}) - 将该对象的
[[Prototype]]指向构造函数的prototype - 把构造函数内部的
this绑定到这个新对象,并执行函数体(给新对象添加属性/方法) - 判断返回值:若构造函数显式
return一个对象类型,则返回该对象;否则默认返回新创建的对象
function Person(name) {
this.name = name;
return { age: 25 }; // ✅ 返回对象 → new 结果就是 { age: 25 }
}
const p = new Person('Alice'); // p === { age: 25 }关键点:new 的 this 永远指向新实例(除非被 return 覆盖),且整个过程无法被普通函数调用模拟。
call 是临时借用函数并指定 this 的一次执行
call 不创建对象、不修改原型链、不干预返回逻辑,它只做两件事:
- 把目标函数的
this临时设为第一个参数(null/undefined时指向全局或undefined(严格模式)) - 立即用后续参数调用该函数
function greet() {
console.log(`Hello, ${this.name}`);
}
const obj = { name: 'Bob' };
greet.call(obj); // ✅ 输出 "Hello, Bob" —— 仅这一次执行中 this 指向 obj注意:call 不改变函数本身,也不影响原型或实例化行为;它对任何函数都适用(包括箭头函数——但箭头函数的 this 无法被 call 改变)。
核心差异一句话总结
-
new是构造器语义:生成实例、建立原型关系、控制返回逻辑,属于面向对象的实例化机制 -
call是执行语义:强行指定某次调用的this值,属于函数调用的上下文劫持,无构造意图
二者不能互换:用 call 无法替代 new 创建带正确原型链的对象;用 new 也无法实现 call 那种灵活切换 this 并传参的普通调用。

















