Javascript 每当读取对象的属性时,如何调用函数?

Javascript 每当读取对象的属性时,如何调用函数?,javascript,ecmascript-6,Javascript,Ecmascript 6,从对象读取属性时,我们可以使用此模式创建挂钩: const obj = {}; Object.defineProperty(obj, 'x', { get: function () { return require('x'); } }); 我想知道在读取对象(如obj)上的任何和所有属性时,是否有方法创建钩子 例如,当代码试图访问属性“y”(该属性在obj上还不存在)时,钩子仍然会被调用 这是关键部分:如果我提前知道对象的所有属性,我就可以遍历它们。但是在这种情况

从对象读取属性时,我们可以使用此模式创建挂钩:

const obj = {};

Object.defineProperty(obj, 'x', {
    get: function () {
      return require('x');
    }
});
我想知道在读取对象(如obj)上的任何和所有属性时,是否有方法创建钩子

例如,当代码试图访问属性“y”(该属性在
obj
上还不存在)时,钩子仍然会被调用


这是关键部分:如果我提前知道对象的所有属性,我就可以遍历它们。但是在这种情况下,属性可能会在以后添加到对象中,或者可能会读取意外的属性(最终用户将调用意外的内容)。

我认为您正在寻找一个新的ECMAScript 2015功能,它允许您为某些内部方法定义自定义行为,例如获取属性。实现陷阱允许在访问属性时调用特定函数:

constobj={};
const proxyObj=新代理(obj{
获取(目标、属性、接收者){
console.log('accessed');
}
});

proxyObj.foobar//一个属性被访问,控制台被记录到
@Andrew Li击败了我,但下面是一个真实的示例,这是我的用例:

//async和bluebird库都安装在我的本地项目中

let obj = {};

const proxy = new Proxy(obj, {
  get(target, property, receiver) {
    return require(property);
  }
});

const {async, bluebird } = proxy;
console.log('bluebird => ', bluebird);
现在我可以将这个代理对象注入任何地方,我自己或最终用户可以轻松地访问依赖项。这样做的目的是,如果您实际上不需要依赖项,就不需要预加载它们。它还可以在这里和那里保存几行代码。

看看