React 源码中的 Object.seal
本文源码基于 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相关推荐
- react源码中的fiber架构
先看一下FiberNode在源码中的样子 FiberNode // packages/react-reconciler/src/ReactFiber.old.js function FiberNode ...
- 细说react源码中的合成事件
React 的鲜活生命起源于 ReactDOM.render ,这个过程会为它的一生储备好很多必需品,我们顺着这个线索,一探婴儿般 React 应用诞生之初的悦然. 更新创建的操作我们总结为以下两种场 ...
- React 源码系列 | React Context 详解
目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api.大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(react-redux). 想想项 ...
- webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...
引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...
- React 源码剖析系列 - 解密 setState
this.setState() 方法应该是每一位使用 React 的同学最先熟悉的 API.然而,你真的了解 setState 么?先看看下面这个小问题,你能否正确回答. 引子 class Examp ...
- React源码解毒 - render方法解析
render方法解析 要将react元素渲染到页面当中,分为了两个阶段: render阶段 和 commit阶段. render阶段:由协调层负责的阶段 在这个阶段当中要为每一个react元素构建对应 ...
- React 源码剖析系列 - 不可思议的 react diff
目前,前端领域中 React 势头正盛,使用者众多却少有能够深入剖析内部实现机制和原理.本系列文章希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. React diff 作 ...
- react map循环生成的button_【第1945期】彻底搞懂React源码调度原理(Concurrent模式)...
前言 估计会懵逼.今日早读文章由成都@苏溪云投稿分享. 正文从这开始~~ 最早之前,React还没有用fiber重写,那个时候对React调度模块就有好奇.而现在的调度模块对于之前没研究过它的我来说更 ...
- React源码解读之React Fiber
开始之前,先讲一下该文章能帮你解决哪些问题? 开始之前,先讲一下该文章能帮你解决哪些问题? facebook为什么要使用重构React React Fiber是什么 React Fiber的核心算法 ...
最新文章
- opencv 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突
- c语言冒泡排序(解析)
- Space-Filling Designs
- Python3实现旋转数组的3种算法
- 大圣魔方——美团点评酒旅BI报表工具平台开发实践
- 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
- 程序员想要设计一门新的编程语言,学习什么语言好,用C/C++合适吗?
- EntityFrameWork连接多Db配置
- 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选
- React Router学习
- Windows上编译OpenEXR
- kotlin内联函数_Kotlin内联函数,参数化
- C#中如何跨窗体传值
- linux 查看进程与端口以及内存资源
- Java基础(一):Java集合框架(超详细解析,看完面试不再怕)
- HeitiCSEG 文鼎CS大黑 字体下载
- 钢琴专业打谱软件 Overture 4.02
- 总谐波失真计算公式_知识学习:谐波的危害
- [CVPR2022] A Dual Weighting Label Assignment Scheme for Object Detection
- layui表格table固定表头第一行固定显示
热门文章
- nb_samples(采样数)转换
- 用MDT 2012为企业部署windows 7(十)--制作windows 7标准模板机
- Pycharm | cv2爆红 | opencv-python安装 | Requirement already satisfied: opencv-python 有效解决方法
- 安装了 gosublime出现错误: MarGo: Missing required environment variables: GOPATH
- Learning Better Lossless Compression Using Lossy Compression
- 最全总结 | 聊聊 Python 办公自动化之 Word(中)
- JAVA学习笔记五---函数
- 博客文章内容导航(实时更新)
- matlab logpolar,GitHub - luxinjin/polar-code: matlab simulation for polar code
- 绘制渐变图形--Canvas的基本操作