为什么下面的代码会记录 undefined for a.bar?

Why does the code below log undefined for a.bar?

我编写了下面的代码,为 proxy_a 的内部原型获取例程设置了 trap,但代码似乎没有按预期工作。

var base = {
  foo: 100
}

var a = {
  bar: 10
};

var proxy_a = new Proxy(a, {
  getPrototypeOf: function(target) {
    return base;
  }
});

// make proxy_a the prototype of b
var b = Object.create(proxy_a);

console.log(b.bar);
console.log(b.foo);

这是输出结果

>> 10
>> undefined

问题出在第二条日志语句上。我希望对 b.foo 的访问解析为 base 对象的 foo 属性,但这并没有发生。

任何人都可以解释我做错了什么,最好参考 ECMAScript 规范吗?

It looks like 在没有 get 处理程序的情况下访问代理对象上的 属性 将简单地将 属性 访问委托给代理目标。和做a.foo基本一样。这意味着 foo 是在 a 的原型 上寻找的,而不是代理对象的原型(这将触发 getPrototypeOf)。

  1. Let trap be ? GetMethod(handler, "get").
  2. If trap is undefined, then
    7.a Return ? target.[[Get]](P, Receiver).