object.preventextensions仅阻止向对象自身添加新属性,不限制已有属性的读写、删除、配置修改,也不影响原型链;需配合object.isextensible检测,且不递归作用于嵌套对象。

Object.preventExtensions 用于阻止对象被添加新属性,但已存在的属性仍可读写、可配置、可枚举,也能被删除。
基本用法:冻结对象的“结构”
调用 Object.preventExtensions(obj) 后,该对象不能再新增属性(包括直接赋值和 Object.defineProperty),但其他操作不受限。
- ✅ 允许修改已有属性值(如
obj.name = "new") - ✅ 允许删除已有属性(
delete obj.age) - ✅ 允许重新定义已有属性(
Object.defineProperty(obj, "name", {...})) - ❌ 禁止添加新属性(
obj.city = "Beijing"在严格模式下报错,非严格模式静默失败)
如何检测一个对象是否已被禁止扩展
使用 Object.isExtensible(obj) 判断:
- 返回
true表示还可添加属性 - 返回
false表示已被preventExtensions或更严格的seal/freeze处理过
注意:Object.seal 和 Object.freeze 都会自动调用 preventExtensions,所以它们返回的也是 false。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
与 seal 和 freeze 的区别
三者是递进关系:
- preventExtensions:只锁“增”,不限“删/改/配置”
-
seal:在 preventExtensions 基础上,把所有现有属性设为
configurable: false(不能删、不能改描述符) -
freeze:在 seal 基础上,把所有数据属性设为
writable: false(值不可改)
也就是说,freeze(obj) ≡ seal(obj) ≡ preventExtensions(obj) + 更多限制。
实际使用建议
适合在对象初始化完成后、对外暴露前,防止意外添加字段:
- 常用于配置对象、构造函数返回的实例、模块导出的常量对象
- 不要对普通变量或临时对象滥用,会影响调试和灵活性
- 配合
Object.isExtensible做防御性检查,尤其在接收外部传入对象时 - 注意它只作用于对象自身,不递归处理嵌套对象(需手动遍历或用深冻结库)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










