本文源码基于 React V18.8.6

源码

在 React 和 ReactROM 源码中,xx.development.js 代码都会使用到 Object.seal,主要是对 ref 做属性扩展限制,防止对象的 key 发生变更。

// createRef
export function createRef(): RefObject {const refObject = {current: null,};if (__DEV__) {Object.seal(refObject);}return refObject;
}
// useRef 相关
function mountRef<T>(initialValue: T): {current: T} {const hook = mountWorkInProgressHook();const ref = {current: initialValue};if (__DEV__) {Object.seal(ref);}hook.memoizedState = ref;return ref;
}

Object.seal

Object.seal() 方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。

图中,Object.seal 使用之前 configurable 是 true,使用之后变为 false。

这表示 Object.seal 处理后属性无法删除,也不能从数据描述变为存取描述。MDN 属性描述符

更改枚举属性失败。

删除无效

不能把 a 从数据描述变为存取描述,但是可以通过 Object.defineProperty 改变它的 value,等同于 obj.a = '我是a'

如果对象被 Object.seal 处理过,则对象不能扩展和删除属性,尝试扩展一个属性

. 号方式扩展属性静默失败,用 Object.defineProperty 扩展则直接报错 Uncaught TypeError: Cannot define property c, object is not extensible,对象不可扩展了。

使用 Object.isSealed 判断对象是否被 Object.seal 处理。由于被处理的对象无法扩展属性,所以 Object.isExtensible(obj) 也是 false。

Object.freeze

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

Objct.freeze 是完全冻住了这个对象。不能对它和他内部做任何做更改。

使用 Object.defineProperty 更改 value 会直接报错。

obj.a = 10 也失败。

使用 Object.isFrozen(),判断是否被 freeze 了。

能否更改深层对象的属性

Object.seal 是可以更改第一层属性对应的值。

Object.freeze 是不能更改第一层属性对应的值,但可以更改更深层次的值!!!

obj1.a.name = 'yuny' 直接把 name 变成了 yuny


广告时间

欢迎关注,每日进步!!!


React 源码中的 Object.seal相关推荐

  1. react源码中的fiber架构

    先看一下FiberNode在源码中的样子 FiberNode // packages/react-reconciler/src/ReactFiber.old.js function FiberNode ...

  2. 细说react源码中的合成事件

    React 的鲜活生命起源于 ReactDOM.render ,这个过程会为它的一生储备好很多必需品,我们顺着这个线索,一探婴儿般 React 应用诞生之初的悦然. 更新创建的操作我们总结为以下两种场 ...

  3. React 源码系列 | React Context 详解

    目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api.大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(react-redux). 想想项 ...

  4. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  5. React 源码剖析系列 - 解密 setState

    this.setState() 方法应该是每一位使用 React 的同学最先熟悉的 API.然而,你真的了解 setState 么?先看看下面这个小问题,你能否正确回答. 引子 class Examp ...

  6. React源码解毒 - render方法解析

    render方法解析 要将react元素渲染到页面当中,分为了两个阶段: render阶段 和 commit阶段. render阶段:由协调层负责的阶段 在这个阶段当中要为每一个react元素构建对应 ...

  7. React 源码剖析系列 - 不可思议的 react diff

    目前,前端领域中 React 势头正盛,使用者众多却少有能够深入剖析内部实现机制和原理.本系列文章希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. React diff 作 ...

  8. react map循环生成的button_【第1945期】彻底搞懂React源码调度原理(Concurrent模式)...

    前言 估计会懵逼.今日早读文章由成都@苏溪云投稿分享. 正文从这开始~~ 最早之前,React还没有用fiber重写,那个时候对React调度模块就有好奇.而现在的调度模块对于之前没研究过它的我来说更 ...

  9. React源码解读之React Fiber

    开始之前,先讲一下该文章能帮你解决哪些问题? 开始之前,先讲一下该文章能帮你解决哪些问题? facebook为什么要使用重构React React Fiber是什么 React Fiber的核心算法 ...

最新文章

  1. opencv 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突
  2. c语言冒泡排序(解析)
  3. Space-Filling Designs
  4. Python3实现旋转数组的3种算法
  5. 大圣魔方——美团点评酒旅BI报表工具平台开发实践
  6. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
  7. 程序员想要设计一门新的编程语言,学习什么语言好,用C/C++合适吗?
  8. EntityFrameWork连接多Db配置
  9. 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选
  10. React Router学习
  11. Windows上编译OpenEXR
  12. kotlin内联函数_Kotlin内联函数,参数化
  13. C#中如何跨窗体传值
  14. linux 查看进程与端口以及内存资源
  15. Java基础(一):Java集合框架(超详细解析,看完面试不再怕)
  16. HeitiCSEG 文鼎CS大黑 字体下载
  17. 钢琴专业打谱软件 Overture 4.02
  18. 总谐波失真计算公式_知识学习:谐波的危害
  19. [CVPR2022] A Dual Weighting Label Assignment Scheme for Object Detection
  20. layui表格table固定表头第一行固定显示

热门文章

  1. nb_samples(采样数)转换
  2. 用MDT 2012为企业部署windows 7(十)--制作windows 7标准模板机
  3. Pycharm | cv2爆红 | opencv-python安装 | Requirement already satisfied: opencv-python 有效解决方法
  4. 安装了 gosublime出现错误: MarGo: Missing required environment variables: GOPATH
  5. Learning Better Lossless Compression Using Lossy Compression
  6. 最全总结 | 聊聊 Python 办公自动化之 Word(中)
  7. JAVA学习笔记五---函数
  8. 博客文章内容导航(实时更新)
  9. matlab logpolar,GitHub - luxinjin/polar-code: matlab simulation for polar code
  10. 绘制渐变图形--Canvas的基本操作