Proxy 是当前推荐的首选方案,因其更现代、能力更强、适用性更广;Object.defineProperty 仅适用于兼容老环境或极简场景,存在无法监听动态属性、数组方法无响应、嵌套代理复杂等局限。
实现 JavaScript 数据绑定时,Object.defineProperty 和 Proxy 都能拦截对象操作,但 Proxy 更现代、能力更强、适用性更广,是当前推荐的首选方案;Object.defineProperty 仅适用于兼容老环境或极简场景,存在明显局限。
它只能劫持已存在的属性,无法监听动态新增/删除
属性、数组索引变化、for...in 遍历、Object.keys 等操作:
push、pop、splice)无反应,需重写原型方法“打补丁”Proxy 以对象为单位代理,通过 handler 拦截 13 种操作,覆盖绝大多数数据交互场景:
set / deleteProperty)in 操作符和遍历行为(ownKeys、enumerate)若项目需支持 IE 或 iOS Object.defineProperty 是唯一选择(如 Vue 2);否则应优先用 Proxy:
无需第三方库,几行代码即可实现基础响应式:
function reactive(obj) {
return new Proxy(obj, {
set(target, key, value) {
const oldVal = target[key];
target[key] = value;
if (oldVal !== value) console.log(`更新: ${key} =`, value);
return true;
}
});
}
const state = reactive({ count: 0 });
state.count++; // 控制台输出更新日志
state.name = 'test'; // 新增属性也生效