前言

最近参加若川的源码共度活动,第 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. kali Linux 渗透测试 | ARP 欺骗

    目录 ARP 欺骗及其原理 ARP 欺骗实施步骤 必备工具安装 nmap 工具 dsniff 工具 driftnet 工具 ettercap 工具 ARP 欺骗测试 ARP 断网攻击 ARP 欺骗(不 ...

  2. C#和TS/JS的对比学习02:函数与方法

    程序本质上,就是由数据和处理数据的方法构成.函数和方法,这两个名词虽然字面不同,但意义上其实没有区别.只是因为它们出现的地方有异,给予了不同的名称,比如在全局环境中,叫函数,在对象或类中,叫方法.而C ...

  3. html5与css交互 API 《一》classList

    用过jquery的朋友都知道,jquery提供的方法中(3个)可以很方便的为指定的节点添加.删除类选择器,即addClass.removeClass.toggleClass.具体的用法我这里就不谈了, ...

  4. Web Storage相关

    访问原文地址 概述 DOM存储的机制是通过存储字符串类型的键/值对,来提供一种安全的存取方式.这个附加功能的目标是提供一个全面的,可以用来创建交互式应用程序的方法(包括那些高级功能,例如可以离线工作一 ...

  5. notification(浏览器通知)

    一.notification简介 Web Notifications是HTML5 的一个特性,目前我知道的有谷歌浏览器和windows edge对它进行了支持,用于向用户配置和显示桌面通知. 二.no ...

  6. js随手笔记-------理解JavaScript碰撞检测算法核心简单实现原理

    碰撞检测在前端游戏,设计拖拽的实用业务等领域的应用场景非常广泛,今天我们就在这里对于前端JavaScript如何实现碰撞检测算法进行一个原理上的探讨,让大家能够明白如何实现碰撞以及碰撞的理念是什么:1 ...

  7. zx-editor 移动端(HTML5)富文本编辑器,可与原生App混合(hybrid)开发

    ZxEditor 移动端HTML文档(富文本)编辑器,支持图文混排.引用.大标题.无序列表,字体颜色.加粗.斜体. 可用于独立web项目开发,也可以用于与原生App混合(hybrid)开发. 源码地址 ...

  8. 前端面试题整理——HTML/CSS

    如何理解语义化: 对应的内容是用相应意思的标签,增加开发者和机器爬虫对代码的可读性. 块状元素和内联元素: 块状元素有:display:block/table:有div h1 h2 table ul  ...

  9. python根据日期判断星期几(超简洁)

    代码: from datetime import datetime def getWeek(week): print(date + "是星期" + str(week + 1)) d ...

  10. RestTemplate-HTTP工具

    RestTemplate 是由 Spring 提供的一个 HTTP 请求工具.在上文的案例中,开发者也可以不使用 RestTemplate ,使用 Java 自带的 HttpUrlConnection ...