码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Object.preventExtensions vs Object.seal vs Object.freeze


    😄 从Object.defineProperty说起

    使用Object.defineProperty可以给对象定义属性,同时可以给当前属性定义是否可配置,可写,可枚举等特性。比如

    const a = {}
    Object.defineProperty(a, "p", {
        value: 123,
        configurable: true,
        writable:true,
        enumerable: true
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上面的代码给对象a定义了一个p属性,同时通过data descriptor定了特性。这里主要关注两个描述符字段:configurable和writable。

    • configurable:可配置,表示属性是否可以删除,或者重新配置当前data descriptor的值
    • writable:可写,表示是否可以给属性重新赋值

    😄 Object.preventExtensions

    Object.preventExtensions是防止对象新增属性,也防止对象的原型被重新赋值。

    const o1 = {};
    
    Object.preventExtensions(o1);
    
    try {
      Object.defineProperty(o1, 'p1', {
        value: 111
      });
    } catch (e) {
      console.log(e);
      // TypeError: Cannot define property p1, object is not extensible
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里可以看到,如果给o1添加新的属性p1就会报object is not extensible的错误,此时o1不可扩展。

    可以通过Object.isExtensible()来判断是否被prevent

    Object.isExtensible(o1) // true
    
    • 1

    😁 Object.seal

    Object.seal的效果相当于: 在Object.defineProperty时将configurable设置成false,同时对对象调用Object.preventExtensions。但是原有的属性值是可以修改的。

    (function(){
        // 必须在严格模式下 才有产生error  否则 静默失败
        "use strict";
    
        const o2 = { p2: "hello world" }
        Object.seal(o2)
    
        try {
            delete o2.p2
        } catch (e) {
            console.log(e) // Cannot delete property 'p2' of #
        }
        try {
            o2.p3 = 'p3' // Cannot add property p3, object is not extensible
        } catch (e) {
            console.log(e)
        }
         o2.p2 = 'newValue' // 修改成功
         
         // 此时的 o2  { p2: "newValue" }
    })()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    必须在严格模式下才会报错, 否则只是静默失败

    可以通过Object.isSealed()来判断是否被seal

    😆 Object.freeze

    Object.freeze是在Object.seal的基础上再防止属性值被修改,将属性都变成 只读型(Readonly)。

    如果重新在运行上面的代码,会发现 o2.p2 = 'newValue'也会产生错误:

    (function(){
        // 必须在严格模式下 才有产生error  否则 静默失败
        "use strict";
    
        const o2 = { p2: "hello world" }
        Object.seal(o2)
    
        try {
            delete o2.p2
        } catch (e) {
            console.log(e) // Cannot delete property 'p2' of #
        }
        try {
            o2.p3 = 'p3' 
        } catch (e) {
            console.log(e) // Cannot add property p3, object is not extensible
        }
        
        try {
             o2.p2 = 'newValue' // 修改失败
        } catch (e) {
            console.log(e) // Cannot assign to read only property 'p2' of object '#
        }
         
        // 此时的 o2  { p2: "hello world" }
    })()
         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    可以使用Object.isFrozen来判断是否被freeze

    🤩 Object.preventExtensions vs Object.seal vs Object.freeze

    从上面可以看出,这三个方法对 对象的保护程度 是依次递增的。

    • Object.preventExtensions只防止添加属性,不可扩展
    • Object.seal除了不可扩展,也不可配置
    • Object.freeze就像freeze的意思是被冻结,不可扩展,不可配置,不可重写。
  • 相关阅读:
    网络文件转换为转成MultipartFile
    【C++】【自用】STL六大组件:算法
    TiUP DM
    java计算机毕业设计学生心理健康信息咨询系统源码+系统+数据库+lw文档
    alibaba国际版阿里巴巴API接入说明(阿里巴巴商品详情+关键词搜索商品列表)
    SQL 注入 - http头注入之referer注入
    探索React Router:实现动态二级路由
    《安全物联网系统设计》:我强烈建议你给你的物联网系统加一把安全锁
    15.RedHat认证-Ansible自动化运维(上)
    一图看懂Spring事务传播的本质
  • 原文地址:https://blog.csdn.net/qq_41494959/article/details/126395141
    • 最新文章
    • 沪漂五周年了:我越来越迷茫了
      Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
      MySQL-Seconds_behind_master的精度误差
      [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
      AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
      Agent OS :五种驯服不确定性的范式
      PortSwigger SQL注入LAB11
      数据库即时编译JIT
      [Begin]AI Learn Data Day 0
      深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    小工具 小游戏
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

    京公网安备 11010502049817号