new 关键字做了什么
2025年7月16日大约 3 分钟
new 关键字做了什么
什么是 new 关键字
mdn 中对 new 的描述是:
运算符允许开发人员创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
在使用 new 关键字的时候,运行引主要做了以下四件事:
- 创建一个空的对象,
- 将他的原型指向构造函数的 prototype
- 执行构造函数,将 this 绑定到这个新的对象上
- 如果构造函数显示的返回一个对象,则使用它,否则返回新的创建的对象

function myNew(constructor: Function, ...args) {
// 创建一个新对象使对象的__proto__指向构造函数prototype
const object = Object.create(constructor.prototype)
//执行构造函数,将this绑定到新的对象上
const res = constructor.apply(object, args)
// 如果构造函数显示的返回一个对象,则使用它,否则返回新的创建的对象
return (typeof res === 'object' && res !== null) || typeof res === 'function'
? res
: object
}

new 关键字始终返回的都是一个引用类型
,这样设计主要有以下几点原因:
- 面向对象的一致性和可靠性
在绝大数 new 关键字用来创建一个对象的实例,构造函数没有显式返回值时也能默认返回一个对象,保证构造函数的行为一致,易于预期。保证构造函数总是返回一个对象。
- 允许构造函数主动控制返回值,保证灵活性
使用工厂函数或工厂对象
对象具有扩展能力和原型结构
基本类型不具有扩展能力和原型,返回没有意义
避免错误的返回无效值
function B() {
return 123
}
const b = new B()
// 返回 123 会导致 b 是个 number,没法再 b.name、b instanceof 等
这里有一个令人迷惑的地方:
const a = 1
a.__proto__

这里原始类型似乎也存在原型,这里其实是 js 在运行时做个一个自动装箱的操作,这个操作是隐式完成的,为了提高效率
- 临时把 a 装箱成 new Number(1)
- 访问 new Number(1).proto → 返回 Number.prototype
- 显示为一个 Number 对象,包含 toString 等方法
- 装箱对象 用完即销毁,a 本身还是原始值
怎么判断对象是使用 new 关键字调用的
在通过 new 运算符执行的函数或构造函数中,new.target 返回一个指向 new 调用的构造函数或函数的引用。在普通的函数调用中,new.target 的值是 undefined。

主要实现原理
在 ECMAScript 引擎内部:
• 每次调用函数,JS 引擎会创建一个 新的执行上下文(Execution Context)
• 每个上下文都可能携带一个特殊字段:[[NewTarget]]
• 这个字段就是用来支持 new.target 的核心机制