为什么下面的代码为 a.bar 记录未定义?

问题描述

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

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 的访问可以解析为 foo 对象的 base 属性,但这并没有发生。

谁能解释我做错了什么,最好参考 ECMAScript 规范?

解决方法

It looks like 在没有获取处理程序的情况下访问代理对象上的属性将简单地将属性访问委托给代理目标。它与执行 a.foo 基本相同。这意味着在 foo 的原型上查找 a,而不是代理对象的原型(这会触发 getPrototypeOf)。

  1. trap 成为? GetMethod(handler,"get").
  2. 如果trap未定义,则
    7.a 返回 ? 目标.[[Get]](P,接收者).