Proxy 与 Object.defineProperty 深度解析:JavaScript 拦截机制对比
1. 前言
在前端开发中,需要对对象属性进行拦截、监听或动态处理时,常会用到两种原生 API:Object.defineProperty 和 Proxy。对象属性拦截是实现响应式编程、数据验证和代理模式的核心技术。ES5 引入了 Object.defineProperty,为对象属性提供了基础拦截能力。而 ES6 引入的 Proxy 则彻底改变了游戏规则,提供了更强大、更灵活的拦截机制。
本章将从原理、使用方式、性能和兼容性等角度,详解两者的区别,并通过实际案例展示它们在现代前端开发中的应用。
2. 背景与原理
2.1 Object.defineProperty
推出时间:ES5
原理:在已有对象上为单个属性添加或修改访问器(getter/setter),只能拦截对该属性的读取与写入。
基础语法与使用
const obj = { name: 'Alice' };
Object.defineProperty(obj, 'age', {
enumerable: true, // 可枚举
configurable: true, // 可配置
get() {
console.log('获取 age 属性');
return this._age || 18;
},
set(value) {
console.log('设置 age 属性');
if (value < 0) throw new Error('年龄不能为负');
this._age = value;
}
});
console.log(obj.age);
obj. = ;
.(obj.);


