object.preventextensions()仅禁止添加新属性,允许修改/删除已有属性及更改其描述符;调用后对象不可扩展,可用object.isextensible()检测;它比seal和freeze约束更弱,且不可逆、不深冻结。

Object.preventExtensions() 会冻结对象的“结构”——即禁止新增属性,但允许修改已有属性的值、删除属性、或更改属性描述符(只要目标属性本身可配置)。
核心行为:只封“加法”,不封“改删”
调用后,对象进入“不可扩展”状态:
- 无法通过点号(
obj.newProp = 1)、方括号(obj['newProp'] = 1)或Object.defineProperty()添加新属性 - 已有属性照常读写、删除(
delete obj.existing)、重定义(如把writable: true改为false,前提是该属性configurable: true) - 原型链不受影响——仍可给原型添加属性,子对象继承行为不变
如何检测一个对象是否被禁止扩展
使用 Object.isExtensible(obj):
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 返回
false表示已调用preventExtensions(或更严格的seal/freeze) - 返回
true表示仍可自由添加属性 - 注意:该方法不反映属性级限制(如
writable或configurable),只管“能否加新属性”
与 Object.seal() 和 Object.freeze() 的区别
三者是递进关系,约束力度逐级增强:
-
preventExtensions:仅禁新增 → 允许改值、删属性、改描述符 -
seal=preventExtensions+ 所有现有属性configurable: false→ 禁新增、禁删、禁改描述符,但允许改值(若writable: true) -
freeze=seal+ 所有现有属性writable: false→ 完全只读(浅层)
实际使用注意点
它不深冻结,也不防篡改引用内容:
- 对嵌套对象无效——
obj.nested仍可自由增删改,除非单独对其调用preventExtensions - 不可逆:一旦禁止扩展,无法恢复为可扩展状态
- 非严格模式下,新增属性操作静默失败(不报错,赋值无效);严格模式下抛
TypeError - 建议配合
Object.isExtensible()做防御性判断,尤其在封装不可变逻辑时
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










