禁止扩展对象

属性描述符

在我们创建一个普通对象时,对象的属性都具有隐藏的属性描述符。默认它们都是true。

javascript 复制代码
var obj = {
    a: 123
  }

在obj对象属性a中包含了以下属性描述符:

  • writable

writable决定是否可以修改属性的

javascript 复制代码
  var obj = {}
  Object.defineProperty(obj, 'a', {
    value: 123,
    writalbe: false
  })
  obj.a = 234 // 在严格模式下这种修改会报错
  console.log(obj.a); // 123
  • enumerable

决定这个属性是否可枚举

javascript 复制代码
  var obj = {
    b: 234,
    c: 897
  }
  Object.defineProperty(obj, 'a', {
    value: 123,
    enumerable: false
  })
  for (let key in obj) {
    console.log(key); // b、c
  }
  • configurable

configurable决定这个属性是否可配置

javascript 复制代码
  var obj = {
    a: ''
  }
  Object.defineProperty(obj, 'a', {
    value: 123,
    writable: false,
    configurable: false
  })
  Object.defineProperty(obj, 'a', {
    writable: true
  })
  /*
  *Cannot redefine property: a
    at Function.defineProperty (<anonymous>)
    at test.html:28:10
  */

对象的禁止扩展方式

  • Object.preventExtensions

preventExtensions禁止向对象添加新的属性(可以配置、修改属性、删除属性)

javascript 复制代码
​
  var obj = {
    a: 234
  }
  Object.preventExtensions(obj)
  obj.b = 456
  console.log(obj);

​
  • Object.seal

这个方法实际上会在现有的对象上调用Object.preventExtensions,除了不可添加新的属性还不可以配置属性、删除属性。(可以修改属性)

javascript 复制代码
  var obj = {
    a: 234
  }
  Object.seal(obj)
  obj.a = 123
  delete obj.a
  console.log(obj); // {a:123}
  • Object.freeze

这个属性会创建一个冻结对象,会在现有的对象上调用Object.seal并把 所有的属性标记为writable:false,无法修改它们。

javascript 复制代码
  var obj = {
    a: 234
  }
  Object.freeze(obj)
  obj.a = 123
  console.log(obj); // {a:234}
相关推荐
weedsfly1 小时前
异步编程全景与事件循环——彻底搞懂 JS 执行机制
前端·javascript
用户1733598075371 小时前
纯前端 PDF 数字签名实战:Vue 3 + pdf-lib 在浏览器里完成签名嵌入
前端·javascript
JieE21212 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE21212 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
kyriewen16 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher17 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙17 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
jump_jump17 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
swipe19 小时前
正则表达式入门到进阶:从表单校验到手写模板引擎
前端·javascript·面试
kyriewen19 小时前
前端错误监控最全指南:捕获 JS 异常、Promise 拒绝、资源加载失败,附上报代码
前端·javascript·监控