new 关键字做了什么
2024年11月30日大约 4 分钟
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__
原始类型看似也能访问“原型能力”,本质上是 JavaScript 运行时触发了隐式自动装箱,以便临时借用对应包装对象的方法能力。
- 临时把 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 的核心机制
背景
「new 关键字做了什么」属于对象模型基础主题,理解深度直接影响复杂调试与框架源码阅读效率。
核心原理
对象访问基于原型链查找,实例创建依赖构造流程与 this 绑定规则。
实现方式 / 示例
建议配套给出“标准场景 + 反例场景”,验证原型遮蔽、返回对象、跨上下文 instanceof 的差异。
常见问题
- prototype 与 proto 概念混用。
- 忽视 constructor 返回值规则。
- 在多运行时上下文中误用实例判断。
最佳实践
在知识文档中显式标注边界行为与替代判断方法,避免经验化误导。
总结
围绕「new 关键字做了什么」的掌握程度决定了你对 JS 对象行为的可预测性。
