手写系列:面试官问我 new 的原理,我直接甩出三个版本
今天我们来聊聊 JavaScript 中那个既熟悉又神秘的 new 操作符。相信很多小伙伴在面试时都经历过这样的“名场面”面试官微微一笑推过来那个熟悉的键盘“来能不能手写一个 new 的实现”这时候如果你只是背诵了代码稍微问深一点可能就露怯了。今天我们就把这个“黑盒”拆开从底层原理到完美实现彻底搞懂它一、核心原理拆解new 到底干了啥我们在日常开发中const person new Person(Fog, 18) 写得飞起。但 new 背后到底发生了什么简单来说new 就是一个**“生产车间”**。它拿着你的图纸构造函数给你造出一个实实在在的产品实例对象。这个过程标准流程只有四步核心四步法建空房创建一个全新的空对象 {}。挂牌子将这个空对象的原型链proto链接到构造函数的原型对象prototype上。这步最关键决定了你能用这一类的公共方法。搞装修将构造函数内部的 this 指向这个新对象并执行构造函数。给对象添加属性如 name, age。交钥匙判断构造函数的返回值。如果构造函数自己返回了一个对象或函数那就以它为准否则默认返回我们在第一步创建的那个新对象。二、面试官到底在考什么面试官让你手写 new绝对不是为了看你默写代码。通过这寥寥几行代码他在考察你以下四大内功原型链的理解你知不知道实例和类是怎么关联起来的this 指向机制你懂不懂怎么用 call 或 apply 改变函数执行上下文函数参数处理面对不定参数你会用 arguments 还是 ...args边界情况处理**这是高分点**如果构造函数里写了 return你的代码还能正常工作吗三、手写进阶之路接下来我们由浅入深演示三个版本的实现。V1.0 青铜版ES5 经典写法这是最基础的写法也是很多老教材里的标准答案。我们需要处理 arguments 这个“伪数组”。JavaScriptfunction Person(name, age) { this.name name; this.age age; } Person.prototype.sayName function () { console.log(this.name); } // 核心实现 function objectFactory() { // 1. 创建一个空对象 var obj new Object(); // 2. 获取构造函数 // arguments 是类数组没有 shift 方法我们借用数组原型的 shift // 这行代码有两个作用取出第一个参数(Constructor)同时 arguments 里剩下的就是参数了 var Constructor [].shift.call(arguments); // 3. 链接原型让 obj 能访问 Person.prototype 上的属性 obj.__proto__ Constructor.prototype; // 4. 绑定 this 并执行 // 使用 apply 将 remaining arguments 传进去 var result Constructor.apply(obj, arguments); // 5. 返回值处理 // 这是一个常见的简易判断但其实有漏洞稍后在王者版揭晓 return typeof result object result ! null ? result : obj; } // 测试 var awei objectFactory(Person, 阿伟, 20); console.log(awei.name); // 阿伟 awei.sayName(); // 阿伟重点解析为什么用 [].shift.call(arguments)arguments 是一个类数组对象有 length有索引但没数组方法。通过 call我们强行让它借用了数组的 shift 方法切掉并拿到了第一个参数构造函数剩下的正好传给 apply。V2.0 黄金版ES6 现代化写法时代变了我们有了更优雅的语法糖。proto虽然好用但在生产环境中被视为非标准尽管浏览器支持性能也不如 Object.create。JavaScript// 使用 ...args 剩余参数告别 arguments function objectFactory(Constructor, ...args) { // 1. 2. 创建对象并直接链接原型 // Object.create(proto) 创建一个新对象带着指定的原型性能更好更符合规范 const obj Object.create(Constructor.prototype); // 3. 执行构造函数 const result Constructor.apply(obj, args); // 4. 返回值处理 (依然沿用旧逻辑) return typeof result object result ! null ? result : obj; }重点解析Object.create 的优势它直接创建一个已经连接好原型的对象避免了创建后再修改proto指针带来的性能损耗修改原型链在 V8 引擎中是非常昂贵的操作。V3.0 王者版无懈可击的最终版注意了如果你能写出这个版本面试官绝对会对你刮目相看。在 V1 和 V2 中我们对返回值的判断是 typeof result object。这有一个巨大的隐形漏洞如果构造函数返回的是一个 function 呢在 JS 原生 new 中如果构造函数返回函数new 表达式的结果就是那个函数。但 typeof function 是 function 而不是 object之前的代码会错误地返回 obj 实例。JavaScriptfunction objectFactory(Constructor, ...args) { // 0. 参数校验 (严谨性加分项) if (typeof Constructor ! function) { throw new TypeError(Constructor must be a function); } // 1. 创建对象链接原型 const obj Object.create(Constructor.prototype); // 2. 绑定 this 执行 const result Constructor.apply(obj, args); // 3. 完美的返回值处理关键修正 // 如果 result 是对象(非null) 或者 是函数则返回 result // 否则返回新创建的 obj const isObject typeof result object result ! null; const isFunction typeof result function; return (isObject || isFunction) ? result : obj; } // 验证特殊情况 function Factory() { return function() { console.log(I am a function); }; } const test objectFactory(Factory); console.log(typeof test); // function —— 逻辑正确四、总结你看所谓的“手写源码”其实就是对基础知识的排列组合。创建Object.create执行Function.prototype.apply判断类型检测与逻辑运算掌握了这三点new 操作符对你来说就不再是黑盒。下次面试遇到直接展示“王者版”告诉面试官我不止会写我还知道为什么要这么写。

相关新闻

26年已经跑了九家前端面试,基本全过了

26年已经跑了九家前端面试,基本全过了

经过对今年九家不同公司前端岗位的面试,我在技术面总结出有效的通关规律。抛开个人背景差异,如今的面试正在系统性聚焦以下几个维度: 一、框架原理的深度成为基础门槛 几乎所有面试都包含对 React/Vue 核心机制的分层追问。例如:…

2026/7/4 15:20:51 阅读更多 →
科技普惠基层,AI肝胆超级医生让优质诊疗服务下沉

科技普惠基层,AI肝胆超级医生让优质诊疗服务下沉

“过去发现患者肝脏影像异常,我们只能建议转诊到上级医院,患者来回奔波,既耗时又费力。现在有了AI肝胆超级医生,我们能即时获得三甲医院级别的诊断支持,很多患者不用再跑冤枉路了。”这是基层医疗机构医生的真实心声。…

2026/7/2 23:45:54 阅读更多 →
多智能体协同编队控制(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

多智能体协同编队控制(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

多智能体协同编队控制(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码多智能体协同编队控制主要包含以下相关代码及对应参考文献[1]基于VBAP的多AUV编队控制方法及仿真[2]基于采样的多智能体系统的一致性控制相关代码[3]具有非…

2026/7/4 16:27:29 阅读更多 →

最新新闻

如何用嘎嘎降AI处理英语专业论文:英语专业毕业论文降AI知网4.8元完整操作教程

如何用嘎嘎降AI处理英语专业论文:英语专业毕业论文降AI知网4.8元完整操作教程

如何用嘎嘎降AI处理英语专业论文:英语专业毕业论文降AI知网4.8元完整操作教程 处理英语专业论文降AI教程时最怕两件事:降不下来,和改完不知道对不对。 这篇把整个流程梳理清楚,用嘎嘎降AI(www.aigcleaner.com&#x…

2026/7/5 4:51:21 阅读更多 →
为庆祝《终结者 2》上映 35 周年,工业光魔创始人探讨 T-1000 特效技术挑战

为庆祝《终结者 2》上映 35 周年,工业光魔创始人探讨 T-1000 特效技术挑战

【导语:为庆祝《终结者 2》上映 35 周年,工业光魔计算机图形部门几位创始人聚在一起,探讨打造液态金属 T - 1000 角色面临的技术挑战,想了解电影特效可看迪士尼纪录片。】《终结者 2》35 周年:特效技术探讨重聚在《终结…

2026/7/5 4:51:21 阅读更多 →
GESP2026年6月认证C++二级( 第一部分选择题(1-7))精讲

GESP2026年6月认证C++二级( 第一部分选择题(1-7))精讲

第一题 未来农场的神奇传感器(答案:C)1、📖故事开始(1)今天,小明来到了未来智慧农场。农场里没有农民拿着水壶浇地,而是有一个小机器人不停地说:"土地有点干了&…

2026/7/5 4:49:20 阅读更多 →
Sketch批量重命名插件终极指南:告别手动命名,提升设计效率10倍

Sketch批量重命名插件终极指南:告别手动命名,提升设计效率10倍

Sketch批量重命名插件终极指南:告别手动命名,提升设计效率10倍 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 你是否曾因Sketch文件中…

2026/7/5 4:49:20 阅读更多 →
图像频域滤波实战:3步实现基于2D-FFT的高斯低通与高通滤波

图像频域滤波实战:3步实现基于2D-FFT的高斯低通与高通滤波

图像频域滤波实战:3步实现基于2D-FFT的高斯低通与高通滤波 1. 频域滤波的核心原理 当你第一次看到图像的频域表示时,可能会觉得那些对称的亮斑和条纹像某种抽象艺术。但正是这些看似神秘的图案,蕴含着图像处理的强大力量。频域滤波的核心思想…

2026/7/5 4:45:18 阅读更多 →
DeepSeek-R1本地部署指南:消费级硬件运行高效AI推理模型

DeepSeek-R1本地部署指南:消费级硬件运行高效AI推理模型

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你是一名开发者,最近在尝试构建自己的AI应用,或者正在为团队寻找一个高效、低成本的本地AI解决方案&#…

2026/7/5 4:43:18 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻