前言

最近参加若川的源码共度活动,第 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']

收获

  1. Object.freeze 对象后,对象属性不能添加,不能删除,不能给对象以.key 方式修改值,不能给对象以 Object.defineProperty(obj,key9,{value:val9,enumerable:false})方式修改值。

  2. for...in 循环的 key 是自己的属性和原型链上的属性们,所以深拷贝的时候 for...in 循环里要判断 if(obj.hasOwnProperty(key)){ result[key] = deepClone(obj[key])}。

  3. Object.keys 方法:得到对象自己的属性数组,不包含原型链上的属性。

  4. Object.getOwnPropertyNames 方法得到对象 b 的自己及原型链上的属性。

  5. JSON.stringify 方法将 obj 序列化为 JSON 字符串,也是自己的属性,跟 Object.keys 一样,不包括原型链上的属性。

  6. 上面 2、3、5 :

    都得不到不可枚举性(使用 Object.defineProperty 方法给对象赋值并设置可枚举型 enumerable 为 false)的属性。

  7. 上面 4 :

    Object.getOwnPropertyNames 方法可以得到不可枚举性的属性的数组。

  8. 上面 6、7 即:

    for...in 循环、Object.keys 方法、JSON.stringify 方法 这仨只能得到枚举性属性,得不到不可枚举性的属性(悄悄的属性得不到);

    Object.getOwnPropertyNames 方法 可以得到不可枚举型(悄悄的属性可得)

  9. 上面所有的意思(对于 Object.freeze 来说):

    Object.freeze 冻结对象后,增加属性、删除属性、光明正大修改属性、悄悄修改属性,都不可以!

参考链接

MDN Web Docs Object.freeze()

js 对象中什么是可枚举性(enumerable)?

JavaScript 属性的可迭代、可修改和可配置特性

Javascript properties are enumerable, writable and configurable

我被冻在了 vue2 源码工具函数第一行Object.freeze()(一)的更多相关文章

  1. Vue2源码分析-逻辑梳理

    很久之前就看完vue1,但是太懒就一直没写博客,这次打算抽下懒筋先把自己看过了记录下来,否则等全部看完,估计又没下文了 看源码总需要抱着一个目的,否则就很难坚持下去,我并没做过vue的项目,我几乎很少 ...

  2. Java JDK1.8源码学习之路 1 Object

    写在最前 对于一个合格的后端程序员来说,现行的流行框架早已经能胜任基本的企业开发,Springboot 任何的框架都把重复的工作更佳简单/优化的解决掉,但是完全陷入在这样的温水里面, 好比温水煮青蛙, ...

  3. vue2源码分析:patch函数

    目录 1.patch函数的脉络 2.类vnode的设计 3.createPatch函数中的辅助函数和patch函数 4.源码运行展示(DEMO) 一.patch函数的脉络 首先梳理一下patch函数的 ...

  4. vue2源码框架和流程分析

    vue整体框架和主要流程分析 之前对看过比较多关于vue源码的文章,但是对于整体框架和流程还是有些模糊,最后用chrome debug对vue的源码进行查看整理出这篇文章.... 本文对vue的整体框 ...

  5. 分享一个公众号h5裂变吸粉源码工具

    这次我是分享我本人制作的一个恶搞程序,说白了就是一个公众号裂变吸粉工具,市面上有很多引流方法,例如最常见的就是色流,哈哈,今天我跟大家分享的方法是有趣的,好玩的,恶搞的.这个程序上线一天已经收获了61 ...

  6. [参考资料] 80个Python经典资料(教程+源码+工具)汇总

    AD : 2018重磅地面课程<机器读心术之语音识别前沿实战特训营>,迈向人工智能新高度 [专题推荐]Python系列英文原版电子书 http://down.51cto.com/zt/10 ...

  7. 一个android dex 转java源码工具

    和dex2jar,smali2java比起来,这个工具至少结果是正确的,前两者对于循环,异常等的处理明显逻辑就是错误的. 该小工具是基于androguard制作,本来是想自己写一个,后来一找居然有现成 ...

  8. 80个Python经典资料(教程+源码+工具)汇总——下载目录 ...

    原文转自:http://bbs.51cto.com/thread-935214-1.html 大家好,51CTO下载中心根据资料的热度和好评度收集了80个Python资料,分享给Python开发的同学 ...

  9. Caffe源码-InsertSplits()函数

    InsertSplits()函数 在Net初始化的过程中,存在一个特殊的修改网络结构的操作,那就是当某层的输出blob对应多个其他层的输入blob时,会在输出blob所在层的后面插入一个新的Split ...

随机推荐

  1. 编译器警告c4996

    由于编译器的原因(我用的是vs 2012),我们写程序时有时候会遇到编译器给出的警告,如: warning C4996: 'fopen': This function or variable may ...

  2. 基 vue-element-admin升级的Vue3 +TS +Element-Plus 版本的后端管理前端解决方案 vue3-element-admin 正式对外发布,有来开源组织又一精心力作,毫无保留开放从0到1构建过程

    项目简介 vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youla ...

  3. java中如何打印规定图案? 举例说明

    9.4 print out the following pattern(打印图案). * *** ***** ******* ***** *** * 提示: 1)本题上面的图案和下面的图案是一样的.所 ...

  4. JavaScript面向对象的方式开发轮播图插件

    轮播图是很多页面必不可少的组件.这里来使用面向对象方式开发一个插件.减去开发的痛楚 首先需要寻找对象:只有一个对象,轮播图!关键点在于找到这个对象所拥有的属性以及方法,通过代码实现出来,这是面向对象最 ...

  5. c++对c的拓展_内联函数

    目的:保持处理宏的高效及安全性 解决的问题:1.c中预处理宏有些难以发现的问题 2.c++ 中预处理不能访问类成员,不能作用类的成员函数 作用:无函数调用时开销,又可像普通函数般进行参数.返回值类型安 ...

  6. Codeforces Round #719 (Div. 3) C. Not Adjacent Matrix

    地址 Problem - C - Codeforces 题意 每个格子,该格子和相邻的格子的值不能相同 题解 思维题, 先从1~n输出奇数,再输出偶数 代码 #include <iostream ...

  7. client 系列

    定义 : client翻译过来就是客户端,我们使用client系列的相关属性来获取元素可视区的相关信息.通过client系列的相关属性可以动态的得到该元素的边框大小.元素大小等.

  8. Google kickstart 2022 Round A题解

    Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...

  9. KotlinMall实战之注册部分MVP架构配置

    包目录如下: ①BaseView部分:基本的回调 interface BaseView { fun showLoading() fun hideLoading() fun onError()} ②Ba ...

  10. 深入了解 TiDB SQL 优化器

    分享嘉宾:张建 PingCAP TiDB优化器与执行引擎技术负责人 编辑整理:Druid中国用户组第6次大数据MeetUp 出品平台:DataFunTalk 导读: 本次报告张老师主要从原理上带大家深 ...