object.isextensible仅检测对象是否允许添加新属性,不控制权限;真正控制扩展权限的是object.preventextensions、object.seal和object.freeze。

Object.isExtensible 本身不管控权限,它只做检测。真正控制属性扩展权限的是 Object.preventExtensions、Object.seal 和 Object.freeze 这三个不可逆方法。而 Object.isExtensible 的作用,是在运行时判断当前对象是否还允许添加新属性,从而决定能否执行下一步操作——比如允许表单补填字段、拒绝非法字段注入、或拦截已锁定状态下的误提交。
用 isExtensible 做业务阶段守门人
在订单、合同、审批单等有明确生命周期的业务实体中,可将对象状态与可扩展性绑定:
- 草稿期:对象默认可扩展,
Object.isExtensible(obj) === true,允许动态加临时字段(如“草稿备注”) - 待审核:调用
Object.preventExtensions(obj)后,isExtensible返回false,此时禁止新增字段,但已有字段仍可修改 - 已确认/归档:进一步
seal或freeze,isExtensible依然为false,配合其他检测(如Object.isFrozen)做更细粒度校验
在关键操作前插入运行时校验
不是靠开发自觉,而是让校验逻辑自动介入。例如:
- 表单提交前:
if (!Object.isExtensible(form)) throw new Error('表单已被锁定') - 字段动态注入(如插件式表单增强):
if (Object.isExtensible(entity)) entity.newField = value,否则跳过或报错 - API 响应解析后初始化实体时,检查服务端是否标记了“只读”,再决定是否调用
preventExtensions
注意兼容性与边界情况
在老旧移动设备(如 iOS 4.3.2、Android 2.3.3 及以下)中,Object.isExtensible 原生不支持。需加特性检测和轻量 Polyfill:
- 先判断
Object.isExtensible是否存在,不存在则自行实现:尝试写入并删除测试属性 - 注意非对象参数行为差异:ES5 报错,ES6 返回
false,Polyfill 应统一按 ES6 语义处理 -
isExtensible对原型链无感知——父对象不可扩展,不影响子对象;需逐层或按需检测
搭配状态管理提升可维护性
单纯依赖 isExtensible 容易丢失上下文。建议补充轻量元信息:
- 给业务对象加
$$lifecycle属性(如'draft'、'submitted'、'archived') - 每次调用
preventExtensions等方法后,同步更新该字段 - 所有写操作入口(如
updateField、addExtension)统一先查isExtensible+ 当前状态,再放行










