news 2026/5/4 0:49:08

揭秘 new 操作符:实例化背后的四部曲

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
揭秘 new 操作符:实例化背后的四部曲

🏗️ 揭秘new操作符:实例化背后的四部曲

在 JavaScript 中,当我们使用new创建一个对象时,浏览器引擎在后台默默执行了一系列复杂的操作。
理解这个过程,不仅能帮你写出更健壮的代码,更是理解原型链(Prototype Chain)继承的关键。

📂 目录

  1. 🤔 什么是new
  2. 🎬 核心流程:new 发生的四个步骤
  3. 💻 手写实现:模拟new操作符
  4. ⚠️ 关键细节:构造函数有返回值怎么办?
  5. 💡 总结

1. 🤔 什么是new

new运算符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

简单来说,它做了两件事:

  1. 创建了一个全新的空对象。
  2. 初始化了这个对象(执行构造函数中的代码)。

通俗比喻
想象你要开一家连锁店(创建实例):

  1. 拿地皮:找一块空地(创建空对象)。
  2. 挂招牌:把这块地关联到总部的品牌规范上(链接原型)。
  3. 装修:按照图纸进行内部装修,配置桌椅板凳(执行构造函数,绑定this)。
  4. 开业:把装修好的店交给店长运营(返回对象)。

2. 🎬 核心流程:new 发生的四个步骤

当执行const obj = new Constructor(arg1, arg2)时,引擎内部严格按以下顺序执行:

✅ 第一步:创建一个全新的空对象

letobj={};

这是一个最普通的、没有任何属性的空对象。

✅ 第二步:链接原型(设置__proto__

将新对象的隐式原型(__proto__)指向构造函数的显式原型(prototype)。

obj.__proto__=Constructor.prototype;

意义:这一步建立了原型链。从此,obj可以访问Constructor.prototype上定义的所有方法和属性。这是 JS 继承的核心。

✅ 第三步:绑定this并执行构造函数

将构造函数内部的this指向这个新对象obj,并传入参数执行函数体。

Constructor.apply(obj,[arg1,arg2]);// 或者Constructor.call(obj,arg1,arg2);

意义:在构造函数中写的this.name = 'Lingma',实际上就是给刚才创建的空对象obj添加属性。

✅ 第四步:返回结果

判断构造函数的返回值:

  • 如果构造函数没有返回值,或者返回的是基本类型(String, Number, Boolean, Null, Undefined),则返回新对象obj
  • 如果构造函数返回的是一个引用类型(Object, Array, Function 等),则直接返回该引用类型,之前创建的obj被丢弃。
returntypeofresult==="object"&&result!==null?result:obj;

3. 💻 手写实现:模拟new操作符

理解了原理,我们就能轻松手写一个_new函数。这是面试中的高频考点。

💻 代码实现

/** * 模拟 new 操作符 * @param {Function} Constructor - 构造函数 * @param {...any} args - 传递给构造函数的参数 * @returns {Object} - 实例对象 */functionmyNew(Constructor,...args){// 1. 校验:Constructor 必须是一个函数if(typeofConstructor!=="function"){thrownewTypeError(`${Constructor}is not a constructor`);}// 2. 创建一个全新的空对象constobj={};// 3. 链接原型:将 obj 的 __proto__ 指向构造函数的 prototype// Object.create 可以更优雅地实现这一步,同时处理 null 原型的情况Object.setPrototypeOf(obj,Constructor.prototype);// 或者兼容写法: obj.__proto__ = Constructor.prototype;// 4. 绑定 this 并执行构造函数constresult=Constructor.apply(obj,args);// 5. 处理返回值// 如果构造函数返回的是对象(引用类型),则返回该对象;否则返回新创建的 objconstisObject=typeofresult==="object"&&result!==null;constisFunction=typeofresult==="function";returnisObject||isFunction?result:obj;}

🧪 测试一下

// 定义一个构造函数functionPerson(name,age){this.name=name;this.age=age;}// 在原型上添加方法Person.prototype.sayHi=function(){console.log(`Hi, I am${this.name}`);};// 使用原生 newconstp1=newPerson("Lingma",1);console.log(p1.name);// "Lingma"p1.sayHi();// "Hi, I am Lingma"// 使用我们手写的 myNewconstp2=myNew(Person,"Aliyun",2);console.log(p2.name);// "Aliyun"p2.sayHi();// "Hi, I am Aliyun"// 验证原型链console.log(p2instanceofPerson);// trueconsole.log(p2.__proto__===Person.prototype);// true

4. ⚠️ 关键细节:构造函数有返回值怎么办?

这是new机制中最容易被忽略的陷阱。

情况 A:返回基本类型(忽略返回值)

functionFoo(){this.a=1;return100;// 返回数字(基本类型)}constobj=newFoo();console.log(obj.a);// 1console.log(obj);// Foo { a: 1 }// 返回值 100 被忽略,依然返回新创建的对象

情况 B:返回引用类型(覆盖新对象)

functionBar(){this.a=1;return{b:2};// 返回对象(引用类型)}constobj=newBar();console.log(obj.a);// undefinedconsole.log(obj.b);// 2console.log(obj);// { b: 2 }// 新创建的对象被丢弃,直接返回构造函数 return 的对象

最佳实践
在编写构造函数时,尽量不要显式返回任何值,或者只返回this。显式返回其他对象会破坏instanceof检查和原型链预期,导致难以排查的 Bug。


5. 💡 总结

步骤操作核心代码示意
1. 创建新建空对象let obj = {}
2. 链接设置原型链obj.__proto__ = Constructor.prototype
3. 绑定执行构造函数Constructor.apply(obj, args)
4. 返回判断返回值return resultIsObject ? result : obj

🚀 博主寄语
new不仅仅是一个关键字,它是 JavaScript基于原型的面向对象系统的入口。

记住三个关键点

  1. 原型链接new的灵魂,它让实例能共享方法。
  2. this绑定new的动作,它让实例拥有独立属性。
  3. 返回值判断new的兜底,防止意外覆盖。

掌握了new的原理,你就掌握了 JS 对象创建的钥匙!

希望这篇文档能帮你彻底搞懂new操作符!如果有疑问,欢迎在评论区留言。👇

喜欢这篇文章吗?记得点赞、收藏、转发哦!❤️

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 0:47:52

3D重建技术:ReLi3D如何解决光照干扰难题

1. 项目概述:当3D重建遇上光影魔术在计算机视觉领域,3D重建技术一直面临着光照干扰的顽固难题。想象一下,你试图用手机拍摄的十几张照片重建一个古董花瓶的3D模型,却发现模型表面出现奇怪的明暗斑块——这正是因为传统算法无法区分…

作者头像 李华
网站建设 2026/5/4 0:47:04

Unlock Music:免费开源的音乐解密工具,轻松解锁加密音乐文件

Unlock Music:免费开源的音乐解密工具,轻松解锁加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web …

作者头像 李华
网站建设 2026/5/4 0:43:52

NVIDIA Nemotron Nano V2 VL边缘计算视觉语言模型解析

1. 项目概述NVIDIA Nemotron Nano V2 VL是英伟达最新推出的轻量级视觉语言模型,专为边缘计算和移动端部署优化。这个7B参数规模的模型在保持高性能的同时,通过创新的量化技术实现了惊人的推理效率提升。我在实际测试中发现,它在NVIDIA Jetson…

作者头像 李华
网站建设 2026/5/4 0:43:13

告别日志海啸:UVM打印分级与verbosity实战调优指南(VCS/SV环境)

UVM日志调优实战:从信息洪流到精准调试的艺术 验证工程师每天面对的第一个挑战往往不是DUT的bug,而是淹没在日志海洋里找不到关键线索。当仿真运行时数小时却只换来数万行混杂着调试信息、状态报告和错误提示的日志文件时,真正的debug工作还没…

作者头像 李华
网站建设 2026/5/4 0:42:49

从零构建语义化代码搜索引擎:基于AST分块与向量检索的工程实践

1. 项目概述:从零构建一个语义化代码搜索引擎如果你和我一样,每天都要在动辄几十万行代码的仓库里找东西,肯定对Ctrl Shift F的暴力搜索又爱又恨。它能找到所有包含关键词的文件,但当你搜索“处理用户认证的逻辑在哪”时&#x…

作者头像 李华