es6的proxy和defineProterty

es6 的代理proxy监听对象属性,那和原来的defineProterty的set,get功能不是一样吗,这两个到底有什么区别

阅读 2.1k
1 个回答

proxyset,get强大多了,它不需要预定义就能监听。
我之前回答一个问题写了简单的取值函数

/**
 * @param target
 * @param exec 取值属性
 * @returns {*}
 */
function getter(target, exec = '_') {
  return new Proxy({}, {
    get: (o, n) => {
      return n === exec ?
        target :
        getter(typeof target === 'undefined' ? target : target[n], exec)
    }
  });
}

这是使用方法,调用对象任意深度属性不会报错

let obj = {
  school: {
    class1: {
      student: 50
    }
  }
};

console.log(getter(obj).school.class1.student._)//50
console.log(getter(obj).school1.class11.student._)//undefined

回答的时候我在想是否可以通过defineProterty来使这个函数兼容性更高,后面发现同样的逻辑仅使用defineProterty根本做不到,原因是defineProterty没办法监听到未定义属性的set,get,这点就被proxy完爆了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题