当前位置: 首页 > article >正文

【JS】如何设置一个只读属性

1. Object.defineProperty

通过属性描述符将属性设置为不可修改

const obj = {};
Object.defineProperty(obj, 'name', {
  value: 'John',
  writable: false, // 不允许修改该属性
  configurable: true, // 允许删除或修改属性描述符
});

console.log(obj.name); // 输出: John

obj.name = 'Alice'; // 不能修改
console.log(obj.name); // 输出: John

2. Object.freeze

冻结对象

const obj = {
  name: 'John'
};

Object.freeze(obj);

obj.name = 'Alice'; // 不会生效
console.log(obj.name); // 输出: John

3. 只设置get访问器

不设置 set 或不进行任何操作

const obj = {};
Object.defineProperty(obj, 'name', {
  get() {
    return 'John';
  },
  set() {
    // 什么也不做,或者抛出异常
    console.log('Cannot modify name');
  }
});

console.log(obj.name); // 输出: John
obj.name = 'Alice'; // 输出: Cannot modify name
console.log(obj.name); // 输出: John

Proxy

劫持某属性,不进行修改

const handler = {
  set(target, prop, value) {
    if (prop === 'name') {
      console.log('Cannot modify name');
      return false; // 阻止修改
    }
    target[prop] = value;
    return true;
  }
};

const obj = new Proxy({ name: 'John' }, handler);

console.log(obj.name); // 输出: John
obj.name = 'Alice'; // 输出: Cannot modify name
console.log(obj.name); // 输出: John

总结

Object.defineProperty: 适用于单个属性的只读设置。
Object.freeze: 会冻结整个对象,包括其所有的属性和方法
get 访问器使得属性变得只读,同时可以进行更复杂的控制,例如通过抛出错误或打印信息来响应修改操作。
Proxy 提供了灵活的控制,可以根据需要对属性设置条件,比如只对某些属性设置只读,而不影响其他属性。


http://www.kler.cn/a/387434.html

相关文章:

  • Android CarrierConfig 参数项和正则匹配逻辑
  • C#-命名空间
  • 【LeetCode】【算法】23. 合并K个升序链表
  • 希尔排序(C语言)
  • 介绍几个提取视频文案的Coze插件
  • linux详解,基本网络枚举
  • 手把手教你写Unity3D飞机大战(5)玩家子弹射击之显示瞄准图标
  • 工程数学线性代数(同济第七版)附册课后习题答案PDF
  • 【重学 MySQL】八十三、掌握循环结构 LOOP、WHILE、REPEAT 的高效应用
  • 使用git lfs向huggingface提交较大的数据或者权重
  • SQLite的BLOB数据类型与C++二进制存储学习记录
  • 403 Request Entity Too Lager(请求体太大啦)
  • 基于Zynq FPGA对雷龙SD NAND的性能测试评估
  • Unet++改进9:添加LSKBlock||动态调整其大空间感受场
  • LeetCode 876.链表的中间结点
  • keep-alive的tab栏内容缓存
  • 共享汽车管理:SpringBoot框架的创新应用
  • vue2 - el-table表格设置动态修改表头
  • 底层视角看C语言
  • EasyExcel的AbstractColumnWidthStyleStrategy注入CellStyle不生效
  • 网页版五子棋—— WebSocket 协议
  • IntelliJ IDEA 中创建目录时 `.` 和 `/` 的区别
  • 【Hadoop和Hbase集群配置】3台虚拟机、jdk+hadoop+hbase下载和安装、环境配置和集群测试
  • go中的类型断言详解
  • 学习笔记:黑马程序员JavaWeb开发教程(2024.11.9)
  • 使用成熟的框架做量化剪枝蒸馏