使用 proxy 可通过拦截 set 和 deleteproperty 操作实现对象属性只读保护,set 中抛错阻止赋值,deleteproperty 中抛错阻止删除,还可扩展拦截 defineproperty、preventextensions 和 setprototypeof 以增强防护。

使用 Proxy 可以轻松实现对象属性的只读保护,核心是拦截 set 和 deleteProperty 操作,并拒绝修改。
拦截赋值操作(set)
通过 set 拦截器阻止对目标对象任何属性的写入。只要尝试赋值,就抛出错误或静默忽略。
- 返回
false表示赋值失败(严格模式下会抛TypeError) - 推荐显式抛错,便于调试和明确语义
- 注意:仅拦截直接赋值,不阻止通过
Object.defineProperty等方式修改(需额外拦截defineProperty)
拦截删除操作(deleteProperty)
只读对象通常也不允许删除属性,需在 deleteProperty 中返回 false 或抛错。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 返回
false会使delete obj.prop返回false - 配合
set一起使用,才能真正“冻结”属性状态
可选:拦截 defineProperty 和 preventExtensions
若需更严格的只读(类似 Object.freeze),还需拦截 defineProperty、preventExtensions 和 setPrototypeOf。
-
defineProperty:防止新增/重定义属性描述符 -
preventExtensions:阻止后续扩展对象 -
setPrototypeOf:禁止修改原型(避免绕过代理)
基础只读代理示例
以下是一个轻量但实用的只读封装:
const readOnly = (obj) => new Proxy(obj, {set() { throw new TypeError('Cannot modify read-only object'); },
deleteProperty() { throw new TypeError('Cannot delete property from read-only object'); }
});
const data = { name: 'Alice', age: 30 };
const safe = readOnly(data);
safe.name = 'Bob'; // 报错
delete safe.age; // 报错










