使用 Object.freeze() 让 JavaScript 对象不能编辑

发布于 2022-08-09 12:32:07 字数 2121 浏览 105 评论 0

关于 如何在 JavaScript 中使对象不可变 ES6 const 关键字  可防止您覆盖对象,但 不会 阻止您更改对象的属性。

const obj = { answer: 42 };

// Even though `obj` is declared with `const`, you can modify
// any properties of `obj`.
obj.answer = 43;
++obj.answer;
obj.otherProperty = 'test';
Object.assign(obj, { anotherProperty: 'test2' });

// You **cannot** overwrite `obj` by assigning to it. This code
// throws an error "assignment to constant variable"
obj = { answer: 41 };

冻结对象

Object.freeze() 函数 可以冻结一个对象。 JavaScript 阻止您添加、删除或修改冻结对象的属性。

const obj = Object.freeze({ answer: 42 });

// Since `obj` is frozen, modifying any of its existing
// properties or adding a new property throws an error:
// "Cannot assign to read only property 'answer' of object '#<Object>'"
obj.answer = 43;

然而, Object.freeze() 不能冻结子对象,您仍然可以修改嵌套的对象属性。

const obj = Object.freeze({ nested: { answer: 42 } });

// Does **not** throw an error. `obj` is a frozen object,
// but `nested` is not.
obj.nested.answer = 43;

有许多用于递归冻结对象的实用程序,包括 deep-freeze

严格模式

非常小心依赖 Object.freeze(): Object.freeze() 不会 之外 抛出错误 严格模式 。 即使你 freeze() 使用严格模式的函数中的对象,修改该对象在严格模式之外不会抛出错误。

function strict() {
  'use strict';
  return Object.freeze({ answer: 42 });
}

function run() {
  const obj = strict();
  // No error because this function is not in strict mode
  ++obj.answer;

  obj.answer; // Still 42
}

run();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

奢欲

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

亽野灬性zι浪

文章 0 评论 0

少年亿悲伤

文章 0 评论 0

南七夏

文章 0 评论 0

qq_EJoXxu

文章 0 评论 0

17780639550

文章 0 评论 0

萌逼全场

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文