参透 JavaScript —— 彻底理解 new 操作符及手写实现

前言

本篇文章主要理解 new 操作符的原理,并手写实现一个自己的 "new"

new 操作符在背后做了什么?

在上篇文章中讲解了原型与原型链,讲到了使用 new 操作符创建实例对象

  1. 为什么 new 操作符创建的对象会拥有构造函数上的全部属性和方法?
  2. 为什么实例对象上的原型指针会指向构造函数的原型?

要明白这些问题,就要知道 new 操作符在实例化时做了什么

翻开《JavaScript 高级程序设计》第四版中关于原型的篇章,当以 new 关键字调用函数时,会执行以下操作:

  1. 在内存中创建一个新对象
  2. 这个新对象内部的 [[Prototype]] 特性被赋值为构造函数的 prototyoe 属性
  3. 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)
  4. 执行构造函数内部的代码(给新对象添加属性)
  5. 如果构造函数返回非空对象,返回这个对象;否则,返回新创建的对象

手写自己的 new 操作符

按照上面流程,我们可以模拟写一个自己的 new

比如,我们拥有一个 myNew 函数

js 复制代码
function myNew(constructor, ...args) {
  // 1.在内存中创建一个新对象
  // 2.这个新对象内部的 `[[Prototype]]` 特性被赋值为构造函数的 prototyoe 属性
  const obj = Object.create(constructor.prototype);

  // 3. 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)
  // 4. 执行构造函数内部的代码(给新对象添加属性)
  const result = constructor.apply(obj, args);

  // 5. 如果构造函数返回非空对象,返回这个对象;否则,返回新创建的对象
  return (result !== null && typeof result === 'object') ? result : obj;
}

解析:

使用 Object.create 来实现第一步、第二步,这个方法会创建一个新对象,并且将新对象的原型指针指向传入的对象的原型

在第三步和第四步,使用了函数上的实例方法 Function.protytype.apply

这个方法会改变函数内部的 this 指向,并且将剩余的参数(arguments)作为数组传入,然后调用该函数

手写的效果

在谷歌浏览器 - F12 开发者工具上测试效果

总结

实例对象拥有构造函数的全部属性和方法,并且原型指针指向构造函数的原型,都是 new 操作符在背后做的工作:

  1. 在内存中创建一个新对象
  2. 这个新对象内部的 [[Prototype]] 特性被赋值为构造函数的 prototyoe 属性
  3. 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)
  4. 执行构造函数内部的代码(给新对象添加属性)
  5. 如果构造函数返回非空对象,返回这个对象;否则,返回新创建的对象

记住,手写实现 new 操作符,本质是为了实践理解 new 操作符的背后原理

参考资料

参透JavaScript系列

本文已收录至《参透 JavaScript 系列》,全文地址:我的 GitHub 博客 | 掘金专栏

交流讨论

对文章内容有任何疑问、建议,或发现有错误,欢迎交流和指正

相关推荐
福兮说12 小时前
前端下载大文件,点了按钮半天没反应:fetch + blob 的三个问题和三种替代写法
前端·javascript·性能优化·文件下载
GreenTea13 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
科技观察哨13 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
niucloud-admin13 小时前
JAVA V6 多商户商城 开发文档——web前端
前端
颜进强14 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
今年下半年15 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
郑州光合科技余经理15 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
前端snow17 小时前
ai agent --- DeepAgents 中间件
前端
data analyse 45617 小时前
报表能自定义的国内统计工具有哪些
前端·数据分析