new操作符实例化对象时执行四步:创建空对象、绑定原型链、以新对象为this执行构造函数、按规则返回对象;不加new会导致this指向错误、全局污染及原型链失效。

构造函数通过 new 关键字实例化对象时,JavaScript 引擎会自动执行四步操作:创建空对象、绑定 this、执行构造函数体、返回新对象(除非显式返回其他对象)。
new 操作符的四个关键步骤
当你写 const obj = new Person("Alice", 30); 时,引擎内部实际做了:
- 创建一个全新的空对象(
{}) - 将该对象的
[[Prototype]]指向构造函数的prototype(即设置原型链) - 以这个新对象为
this执行构造函数体(如赋值this.name = name) - 若构造函数没有显式返回对象,则自动返回这个新对象;若返回了非
null的对象,则忽略新对象,返回该对象
构造函数必须用 new 调用吗?
不是强制语法错误,但不加 new 会导致严重问题:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
this指向全局对象(浏览器中是window,严格模式下是undefined) - 属性被意外挂到全局,造成污染或
TypeError - 无法建立正确的原型链,实例无法访问构造函数
prototype上的方法
可加防护:在构造函数开头检查 this instanceof Constructor,不满足则自动补 new 或报错。
常见误区与注意事项
- 箭头函数不能用作构造函数——它没有
prototype,且不绑定this,调用new ArrowFn()会直接报错 - 构造函数名首字母大写是约定,不是语法要求,但有助于区分普通函数
-
new.target可用于检测是否通过new调用,适合编写兼容性更强的构造逻辑 - 返回原始值(如
return 42)会被忽略,仍返回新对象;只有返回对象才生效
手写一个简易 new 实现(帮助理解)
以下是一个简化版 myNew,体现核心逻辑:
function myNew(constructor, ...args) {
const obj = {};
Object.setPrototypeOf(obj, constructor.prototype);
const result = constructor.apply(obj, args);
return (result !== null && typeof result === 'object') ? result : obj;
}
它模拟了原型绑定和返回控制,但省略了对函数类型、new.target 等细节的校验。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










