Object.defineProperty和Proxy实现拦截的区别

1.Object.definedProperty的实现拦截必须得声明一个额外的变量,例如下面这样

javascript 复制代码
const obj = {};
let _data = "这是一些数据";
Object.defineProperty(obj, "data", {
  get() {
    console.log("读取data的操作被拦截了");
    return _data;
  },
});
console.log(obj.data);

但是如果你这么写,就会报错,栈溢出,因为递归调用了

2.使用proxy,可以定义空对象,里面不写属性值,他不会报栈溢出的原因也是因为没有递归调用,根本原因是因为拦截器返回的不是它本身,而是obj的属性值

javascript 复制代码
const obj = {
};
const p = new Proxy(obj, {
  get(obj, prop) {
    console.log(`${prop}的读取操作被拦截了`);
    return obj[prop];
  },
});
console.log(p.data);
console.log(p.name);

3.如果你这么写,同样会报栈溢出

5.如果想要实现和proxy类似功能,可以这样写

javascript 复制代码
const obj = {
    name:'syt',
    age:4
};
const handler = {
  get(target, prop) {
    console.log(`${prop}的读取操作被拦截了`);
    return target[prop];  // target是另一个对象
  },
  set(target, prop, value) {
    console.log(`${prop}的设置操作被拦截了`);
    target[prop] = value;  // target是另一个对象
    return true;
  }
};

// 手动实现类似Proxy的功能
function createProxy(target, handler) {
  const proxy = {};
  Object.keys(target).forEach(key => {
    Object.defineProperty(proxy, key, {
      get() {
        return handler.get(target, key);  // 这里不会递归
      },
      set(value) {
        handler.set(target, key, value);
      }
    });
  });
  return proxy;
}

const p = createProxy(obj,handler);
console.log(p.name)
p.age=18

6.但是,这种写法,也是必须的在obj中写上所有的key,才可以拦截到,如果你不写的话就拦截不到

7.如果使用proxy的话,就可以不用定义key,写一个空的对象就可以

当然这两个只是拿get和set来做对比,简单记录下

相关推荐
骆驼爱记录几秒前
Word通配符技巧:高效文档处理指南
开发语言·c#·自动化·word·excel·wps·新人首发
bigdata-rookie2 分钟前
Starrocks 数据模型
java·前端·javascript
白帽子凯哥哥4 分钟前
网络安全Web基础完全指南:从小白到入门安全测试
前端·sql·web安全·信息安全·渗透测试·漏洞
RFCEO10 分钟前
前端编程 课程十四、:CSS核心基础2:选择器优先级 + 伪类选择器(解决冲突+交互效果)
前端·css·交互·css选择器优先级判断规则详解·css important使用·css链接伪类lvha顺序·实现悬浮交互效果
web打印社区12 分钟前
前端实现浏览器预览打印:从原生方案到专业工具
前端·javascript·vue.js·electron
yuezhilangniao15 分钟前
# 告别乱码:用FastAPI特性与Next.js打造类型安全的API通信
javascript·安全·fastapi
仟濹19 分钟前
【Java加强】2 泛型 | 打卡day1
java·开发语言
maplewen.21 分钟前
C++11 std::function
开发语言·c++
阿里嘎多学长23 分钟前
2026-02-02 GitHub 热点项目精选
开发语言·程序员·github·代码托管
乔江seven24 分钟前
【python轻量级Web框架 Flask 】1 Flask 初识
开发语言·后端·python·flask