Reflect.preventExtensions仅控制对象能否添加新属性,不修改已有属性的描述符;它只将对象[[Extensible]]内部槽设为false,不影响writable、configurable等属性级设置,也不限制修改或删除已有属性。

Reflect.preventExtensions 的核心行为很明确:它只控制对象能否添加新属性,不碰已有属性的任何设置。
只影响对象层级,不干预属性描述符
调用 Reflect.preventExtensions(obj) 后,obj 的内部 [[Extensible]] 槽位被设为 false,仅此而已。它不会:
- 修改任何已有属性的 configurable、writable 或 enumerable 状态
- 阻止修改已有属性的值(哪怕该属性 writable: true)
- 阻止删除已有属性(哪怕该属性 configurable: true)
- 影响嵌套对象——子对象仍可自由扩展
新增属性操作会失败,但方式取决于上下文
一旦对象不可扩展,所有尝试添加新属性的操作都会受限:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- obj.newProp = value:非严格模式下静默失败(值不生效),严格模式下抛 TypeError
- Object.defineProperty(obj, 'x', {...}):若 'x' 不存在,返回 false(非严格)或抛错(严格)
- Reflect.defineProperty(obj, 'y', {...}):同样返回 false,不会报错,便于程序判断
与 Object.seal 和 Object.freeze 的关键区别
preventExtensions 是最轻量级的结构锁定:
- preventExtensions:禁新增,允许改值、删属性、改描述符
- seal:在 preventExtensions 基础上,把所有自有属性 configurable 设为 false → 禁新增、禁删、禁重配置(如改 writable)
- freeze:在 seal 基础上,再把所有数据属性 writable 设为 false → 彻底只读(禁新增、禁删、禁改值)
配合 Proxy 使用时需注意校验逻辑
如果在 Proxy 的 preventExtensions trap 中返回 true,必须确保目标对象已被真实设为不可扩展:
- 直接 return true 而没调用 Reflect.preventExtensions(target) → 抛出 TypeError
- 正确做法是先 Reflect.preventExtensions(target),再 return 其返回值
- 返回 false 表示拒绝该操作,目标对象保持可扩展状态

















