我被冻在了 vue2 源码工具函数第一行Object.freeze()(一)
前言
最近参加若川的源码共度活动,第 24 期 vue2 源码工具函数,最开始:
var emptyObject = Object.freeze({});
之前知道 Object.freeze() 是冻结,可是具体是什么呢,错过了就错过了,要不看看吧,那就看看吧,嗯,我这种读源码的方式比较低效,但是还是得看看,不然后面的都不易于理解,就暂且打打基础。
然后就看了MDN Web Docs Object.freeze()
Object.freeze()
Try it
Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
可枚举型、可配置性、可写性,啥意思,要不搜搜?嗯,搜搜。
然后找到了这个js 对象中什么是可枚举性(enumerable)?
看完了这篇,懂了 enumerable,那可配置性呢,继续搜。
找到了这篇JavaScript 属性的可迭代、可修改和可配置特性。
看了一半,有原文链接Javascript properties are enumerable, writable and configurable也看看。
看过中文,英文看着还可以理解。
由于看过第一篇,所以第二篇的标题写错了,加上原文链接是 enumerable,所以,enumerable 是可枚举型,并不是可迭代性 iterable。
所以引用 MDN Web Docs 里的名字,JavaScript 的可枚举性、可配置性、可写性是什么意思呢?
现总结如下。
阅读《js 对象中什么是可枚举性(enumerable)?》有感
读后感
讲 JS 对象的属性的可枚举性(属性的 enumerable):
如果为 false,(for..in 循环、Object.keys 方法、JSON.stringify 方法)这三个操作不会取到该属性。
- 我的示例
// 1. 一个没隐式原型的对象a,没有继承性,因为对象a太美了。a自己有 aa aaa aaaa 三个属性
let a = Object.create(null);
a.aa = 1;
a.aaa = 2;
a.aaaa = 3; // 2. 弄一个对象b,b继承了a的美貌。b自己也有 b bb bbb 仨属性。
let b = Object.create(a);
b;
b.b = "b1";
b.bb = "b2";
b.bbb = 333; // 3. for...in 循环,发现了对象 b 拥有 b bb bbb 和 a aa aaa 一共六个属性的值,属性就是什么方面美,值就是什么方面具体到多少,a4腰,1.8米大长腿。
for (let key in b) {
console.log(b[key]);
} // for...in 循环
// b1
// b2
// 333
// 1
// 2
// 3 // 4. Object.keys() 列出 对象的 属性什么方面美。
Object.keys(b); // ['b', 'bb', 'bbb'] // 5. JSON.stringify() 列出了 对象b 拥有 的属性和值,{腰:a4,腿:1.8m}
JSON.stringify(b); // '{"b":"b1","bb":"b2","bbb":333}' // 6. enumerable 是枚举的,列出,上面 3 4 5 都罗列了 对象b 的属性及其值,所以是可枚举性。 // 7. Object.getOwnPropertyNames() 罗列 对象b 所有属性(包括 可枚举性属性 & 不可枚举性属性),发现:b bb bbb 都是可枚举属性,因为是[.key]的方式定义的嘛。
Object.getOwnPropertyNames(b); // ['b', 'bb', 'bbb'] // 8. Object.defineProperty() 新建 | 修改属性。因为 b 没有 属性 bbbb,所以给对象b定义新属性bbbb,值34,设置属性bbbb具有不可枚举性。
Object.defineProperty(b, "bbbb", { value: 34, enumerable: false }); // {b: 'b1', bb: 'b2', bbb: 333, bbbb: 34} // 9. 罗列b的属性key,发现没有bbbb,因为上面设置了enumerable为false
Object.keys(b); // (3) ['b', 'bb', 'bbb'] // 10. 获取 对象b 的 光明正大定义的属性 和悄悄定义的属性。
Object.getOwnPropertyNames(b); // (4) ['b', 'bb', 'bbb', 'bbbb']
收获
Object.freeze 对象后,对象属性不能添加,不能删除,不能给对象以.key 方式修改值,不能给对象以 Object.defineProperty(obj,key9,{value:val9,enumerable:false})方式修改值。
for...in 循环的 key 是自己的属性和原型链上的属性们,所以深拷贝的时候 for...in 循环里要判断 if(obj.hasOwnProperty(key)){ result[key] = deepClone(obj[key])}。
Object.keys 方法:得到对象自己的属性数组,不包含原型链上的属性。
Object.getOwnPropertyNames 方法得到对象 b 的自己及原型链上的属性。
JSON.stringify 方法将 obj 序列化为 JSON 字符串,也是自己的属性,跟 Object.keys 一样,不包括原型链上的属性。
上面 2、3、5 :
都得不到不可枚举性(使用 Object.defineProperty 方法给对象赋值并设置可枚举型 enumerable 为 false)的属性。上面 4 :
Object.getOwnPropertyNames 方法可以得到不可枚举性的属性的数组。上面 6、7 即:
for...in 循环、Object.keys 方法、JSON.stringify 方法 这仨只能得到枚举性属性,得不到不可枚举性的属性(悄悄的属性得不到);
Object.getOwnPropertyNames 方法 可以得到不可枚举型(悄悄的属性可得)
上面所有的意思(对于 Object.freeze 来说):Object.freeze 冻结对象后,增加属性、删除属性、光明正大修改属性、悄悄修改属性,都不可以!
参考链接
Javascript properties are enumerable, writable and configurable
我被冻在了 vue2 源码工具函数第一行Object.freeze()(一)的更多相关文章
- Vue2源码分析-逻辑梳理
很久之前就看完vue1,但是太懒就一直没写博客,这次打算抽下懒筋先把自己看过了记录下来,否则等全部看完,估计又没下文了 看源码总需要抱着一个目的,否则就很难坚持下去,我并没做过vue的项目,我几乎很少 ...
- Java JDK1.8源码学习之路 1 Object
写在最前 对于一个合格的后端程序员来说,现行的流行框架早已经能胜任基本的企业开发,Springboot 任何的框架都把重复的工作更佳简单/优化的解决掉,但是完全陷入在这样的温水里面, 好比温水煮青蛙, ...
- vue2源码分析:patch函数
目录 1.patch函数的脉络 2.类vnode的设计 3.createPatch函数中的辅助函数和patch函数 4.源码运行展示(DEMO) 一.patch函数的脉络 首先梳理一下patch函数的 ...
- vue2源码框架和流程分析
vue整体框架和主要流程分析 之前对看过比较多关于vue源码的文章,但是对于整体框架和流程还是有些模糊,最后用chrome debug对vue的源码进行查看整理出这篇文章.... 本文对vue的整体框 ...
- 分享一个公众号h5裂变吸粉源码工具
这次我是分享我本人制作的一个恶搞程序,说白了就是一个公众号裂变吸粉工具,市面上有很多引流方法,例如最常见的就是色流,哈哈,今天我跟大家分享的方法是有趣的,好玩的,恶搞的.这个程序上线一天已经收获了61 ...
- [参考资料] 80个Python经典资料(教程+源码+工具)汇总
AD : 2018重磅地面课程<机器读心术之语音识别前沿实战特训营>,迈向人工智能新高度 [专题推荐]Python系列英文原版电子书 http://down.51cto.com/zt/10 ...
- 一个android dex 转java源码工具
和dex2jar,smali2java比起来,这个工具至少结果是正确的,前两者对于循环,异常等的处理明显逻辑就是错误的. 该小工具是基于androguard制作,本来是想自己写一个,后来一找居然有现成 ...
- 80个Python经典资料(教程+源码+工具)汇总——下载目录 ...
原文转自:http://bbs.51cto.com/thread-935214-1.html 大家好,51CTO下载中心根据资料的热度和好评度收集了80个Python资料,分享给Python开发的同学 ...
- Caffe源码-InsertSplits()函数
InsertSplits()函数 在Net初始化的过程中,存在一个特殊的修改网络结构的操作,那就是当某层的输出blob对应多个其他层的输入blob时,会在输出blob所在层的后面插入一个新的Split ...
随机推荐
- html简单响应式滚动条置顶
简单响应式滚动条置顶 一般的,让页面出现滚动条的常见方法有: overflow:auto||overflow:scroll 或者overflow-x水平滚动条和overflow-y垂直滚动条 那么现在 ...
- H5使用Canvas绘图
一.什么是Canvas Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的 ...
- parseFloat的取值
<script type="text/javascript"> document.write(parseFloat("10")) document. ...
- 微信小程序发送验证码功能,验证码倒计时
data{ timer:'', countDownNum:'发送验证码', } // 点击验证码倒计时获取验证码 Gain:function(e){ let that = this let count ...
- Python入门-内置对象函数
1.callable() 查看函数知否可调用,可调用返回True,不可用返回False print("input函数:", callable(input)) #input函数: T ...
- 在uniapp的节流函数
为了解决同一个人连续多次的点击同一个事件会造成的问题,js解决的方法有防抖和节流,防抖和节流都是在一定的时间上控制次数 节流是在定义的时间内连续点击多次事件,只会执行一次 在uniapp的工具文件夹u ...
- Linux---必备命令(2)
进程相关命令 # 查看系统所有的进程 ps -ef ps -ef | grep vim # 过滤出vim有关的进程 ps -ef | grep vim # 过滤出22端口的信息 ps -tunlp | ...
- Spring配置文件-Bean生命周期配置(init-method方法,destory-method方法)
1.UserDaoImpl类 public class UserDaoImpl implements UserDao { public UserDaoImpl(){ System.out.printl ...
- linux三剑客试题汇总
1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 [root@localhost ~]# grep -E '^[sS]' /proc/meminfo [root@loca ...
- Linux shell中2>&1的含义解释
https://blog.csdn.net/zhaominpro/article/details/82630528