手写系列:面试官问我 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/2/3 22:21:23 阅读更多 →
科技普惠基层,AI肝胆超级医生让优质诊疗服务下沉

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

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

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

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

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

2026/2/3 22:19:22 阅读更多 →

最新新闻

JMeter分布式测试实战:突破单机瓶颈,构建高并发压测集群

JMeter分布式测试实战:突破单机瓶颈,构建高并发压测集群

1. 项目概述:为什么单机JMeter会“力不从心”?做性能测试的朋友,估计都经历过这个场景:脚本写好了,参数化也配了,场景设计得挺完美,结果一跑起来,单台机器上的JMeter就开始“气喘吁吁…

2026/7/2 22:43:07 阅读更多 →
暗黑破坏神2存档编辑器:新手5分钟上手完整指南

暗黑破坏神2存档编辑器:新手5分钟上手完整指南

暗黑破坏神2存档编辑器:新手5分钟上手完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2的存档修改而烦恼吗?d2s-editor是一款专为暗黑破坏神2玩家设计的免费开源存档编辑器&…

2026/7/2 22:43:07 阅读更多 →
基于Locust构建百万并发分布式压测集群:架构设计与实战调优

基于Locust构建百万并发分布式压测集群:架构设计与实战调优

1. 项目概述:从单机到集群的负载生成演进在性能测试领域,我们常常面临一个核心矛盾:如何用有限的硬件资源,模拟出真实世界中成千上万甚至百万级别的用户并发访问?早期,我们可能依赖JMeter的单机模式&#x…

2026/7/2 22:41:06 阅读更多 →
从零搭建Jmeter性能测试项目:工程化实践与自动化流水线

从零搭建Jmeter性能测试项目:工程化实践与自动化流水线

1. 项目概述:为什么需要一个“从零搭建”的性能测试项目?如果你是一名测试工程师、开发人员,或者正在负责一个即将上线的系统,听到“性能测试”这个词,大概率会感到既熟悉又头疼。熟悉是因为它关乎系统的稳定性和用户体…

2026/7/2 22:41:06 阅读更多 →
生产环境Locust分布式压测实战:架构、脚本与全链路监控

生产环境Locust分布式压测实战:架构、脚本与全链路监控

1. 项目概述:为什么要在生产环境部署Locust?如果你和我一样,长期在运维和开发一线摸爬滚打,肯定对“性能测试”这四个字又爱又恨。爱的是,它能提前暴露系统瓶颈,避免上线后的“午夜惊魂”;恨的是…

2026/7/2 22:41:06 阅读更多 →
粉笔980是「入门班」还是「全程班」?报课前先把名字搞懂

粉笔980是「入门班」还是「全程班」?报课前先把名字搞懂

先说结论: 粉笔 980 系统班在市面上常被叫作「粉笔基础课」「方法精讲班」「980 班」——名字很多,但多数情况下指向 同一条国考、省考备考主线,更接近 「全程班」 而不是 「入门体验班」。这里的「980」主要指 班型价格档位(俗称…

2026/7/2 22:39:05 阅读更多 →

日新闻

Path of Building PoE2:5步掌握流放之路2角色构建的终极免费工具

Path of Building PoE2:5步掌握流放之路2角色构建的终极免费工具

Path of Building PoE2:5步掌握流放之路2角色构建的终极免费工具 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 还在为《流放之路2》复杂的角色构建而头疼吗?面对上千个天赋节点…

2026/7/2 19:10:19 阅读更多 →
SSH密钥生成原理与跨平台安全实践指南

SSH密钥生成原理与跨平台安全实践指南

1. 为什么今天还必须亲手生成 SSH 密钥——不是“过时操作”,而是安全基建的起点你可能已经点开过几十次 GitHub 的 SSH 设置页,也见过终端里一闪而过的ssh-keygen -t ed25519 -C "your_emailexample.com"命令,但真正理解它在 macO…

2026/7/2 19:10:19 阅读更多 →
GAN工程化实战:从图像合成到物理建模的工业落地路径

GAN工程化实战:从图像合成到物理建模的工业落地路径

1. 项目概述:当GAN不再只是“画图玩具”,它正在悄悄重构现实世界的生产逻辑“Astonishing GAN Applications”——这个标题乍看像科技展会的宣传语,但在我过去三年深度参与17个GAN落地项目的实操经验里,它根本不是修辞&#xff0c…

2026/7/2 19:12:20 阅读更多 →

周新闻

月新闻