javascript中可通过object.defineproperty设置writable: false实现单个属性只读锁定,赋值操作在非严格模式下静默失败、严格模式下抛出typeerror,且仅影响指定属性。

JavaScript 中没有原生的“属性锁定”机制,但可以通过 Object.defineProperty 配合 writable: false 实现单个属性的只读(即“锁定”)效果。这并非真正冻结对象,而是限制该属性值被重新赋值。
用 writable: false 锁定单个属性
设置属性的 writable 为 false 后,对该属性的赋值操作将静默失败(非严格模式)或抛出 TypeError(严格模式),从而实现“锁定”。
- 仅影响该属性本身,不影响其他属性或对象结构
- 必须在定义时或通过
Object.defineProperty显式修改描述符 - 不能与
value和get/set同时存在——若设了get或set,writable会被忽略
示例:
const obj = { name: 'Alice' };
Object.defineProperty(obj, 'name', {
writable: false,
configurable: false // 可选:防止后续 delete 或重定义
});
obj.name = 'Bob'; // 无效(非严格模式)或报错(严格模式)
console.log(obj.name); // 'Alice'
批量锁定多个属性
可封装一个工具函数,遍历指定键名并统一设为不可写:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function lockProperties(obj, keys) {
keys.forEach(key => {
if (obj.hasOwnProperty(key)) {
Object.defineProperty(obj, key, {
writable: false,
configurable: false,
enumerable: true // 保持可枚举,按需调整
});
}
});
}
// 使用
const user = { id: 123, role: 'admin', email: 'a@b.c' };
lockProperties(user, ['id', 'role']);
user.id = 456; // 失效
user.email = 'x@y.z'; // 仍可修改
注意 writable 与其它冻结方式的区别
writable: false 是细粒度控制,和以下方法不同:
-
Object.freeze():递归冻结所有自有属性(writable和configurable均为false),且禁止新增属性 -
Object.seal():仅设所有自有属性configurable: false,但仍允许修改writable属性的值 -
const声明:只锁定变量绑定,不锁定对象内部属性
因此,若只需“锁定几个关键字段”,writable: false 更轻量、更精准。
兼容性与注意事项
该特性在所有现代浏览器及 Node.js 中均支持,但需注意:
- 属性必须已存在,或通过
defineProperty新增;直接赋值创建的属性默认writable: true - 若属性是 accessor(含
get/set),writable不生效,应改用逻辑控制或移除 setter - 锁定后仍可通过
Object.defineProperty重新配置(前提是configurable: true)
真正“防篡改”还需结合 configurable: false,否则别人仍可重新定义该属性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










