不能通过Reflect方法向不可扩展对象添加新属性,但已有属性的读写、删除(若可配置)和描述符修改(若可重定义)仍可能有效;关键取决于对象是否不可扩展及各属性自身的configurable和writable状态。

不能通过 Reflect 方法向不可扩展对象添加新属性,但已有属性的读写、删除(若可配置)和描述符修改(若可重定义)仍可能有效——关键取决于对象是否不可扩展,以及各属性自身的 configurable 和 writable 状态。
不可扩展对象的限制范围
调用 Object.preventExtensions(obj) 或 Reflect.preventExtensions(obj) 后,对象仅被禁止新增自身属性。它不影响:
- 已有属性的值修改(只要
writable: true) - 已有属性的删除(只要
configurable: true) - 已有属性描述符的调整(如
writable从true改为false,前提是configurable: true)
Reflect 方法在不可扩展对象上的行为
Reflect 的多数方法会尊重不可扩展性,但表现各异:
-
Reflect.defineProperty(obj, 'newKey', {...}):尝试定义新属性时返回false(非严格模式),静默失败;定义已有属性则照常执行(只要不违反其描述符约束) -
Reflect.set(obj, 'existingKey', value):成功当且仅当该属性存在且writable: true(或为访问器属性) -
Reflect.deleteProperty(obj, 'key'):成功当且仅当该属性存在且configurable: true -
Reflect.ownKeys(obj):正常返回所有自有键(含不可枚举、Symbol),不受不可扩展影响 -
Reflect.has(obj, 'key'):正常判断属性是否存在(等价于'key' in obj)
如何判断对象是否不可扩展
用 Reflect.isExtensible(obj) 检查,返回 false 即表示不可扩展:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
示例:
const obj = { a: 1 };Reflect.preventExtensions(obj);console.log(Reflect.isExtensible(obj)); // falseobj.b = 2; // 静默失败(非严格模式)
常见误区提醒
不可扩展 ≠ 密封 ≠ 冻结:
- 不可扩展:只拦新增属性,其余操作按属性自身描述符决定
-
密封(
Reflect.seal()):不可新增 + 所有自有属性configurable: false→ 无法删、无法重定义描述符 -
冻结(
Object.freeze()):密封 + 所有数据属性writable: false→ 值也无法改

















