object.preventextensions仅阻止对象新增属性,允许修改值、删除属性及访问原型链;返回原对象,可用object.isextensible检测;与seal、freeze呈递进关系,但不递归作用于嵌套对象。

Object.preventExtensions 是 JavaScript 中用于“收口”对象结构的轻量级防护手段,它不冻结值、不禁止删除、也不影响原型链,只专注一件事:阻止新增属性。
怎么用?一句话搞定
调用 Object.preventExtensions(obj) 即可。它直接修改原对象,返回该对象本身(不是副本),后续任何添加新属性的操作都会失效:
- 非严格模式下:点号赋值(
obj.newKey = 1)、方括号(obj['x'] = 2)、解构赋值({...obj, y: 3})都静默忽略,不报错也不生效 - 严格模式下:上述操作会立即抛出
TypeError - 已有属性照常读写、删除、重定义描述符(如用
Object.defineProperty改writable)
怎么确认对象已被锁定?
用 Object.isExtensible(obj) 检测,返回 false 就表示不可扩展:
- 它只看对象自身的
[[Extensible]]内部标志,不查原型、不看属性是否存在 -
Object.seal()和Object.freeze()内部都会先调用preventExtensions,所以它们也必然返回false - 传入原始值(如字符串、数字)会自动包装,但包装后默认不可扩展,所以
Object.isExtensible("a")返回false
它和 seal / freeze 有什么区别?
三者是递进关系,约束强度逐级增强:
- preventExtensions:只禁新增,改值、删属性、改描述符全允许
-
seal:在 preventExtensions 基础上,把所有自有属性设为
configurable: false→ 禁新增、禁删、禁改描述符,但值还能改 -
freeze:在 seal 基础上,再把所有数据属性设为
writable: false→ 新增、删除、改值、改描述符全部禁止(浅层)
要注意的两个关键限制
这个方法是浅操作,有两个常见盲区容易踩坑:
-
不递归作用于嵌套对象:如果
obj.nested = { x: 1 },调用preventExtensions(obj)后,obj.nested.y = 2依然成功——因为nested本身没被锁定 -
不影响原型链访问:禁止扩展的是自身属性,
obj.toString()或继承来的属性照常可用,它不改变原型查找行为
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











