【问题标题】:Why does the code below log undefined for a.bar?为什么下面的代码为 a.bar 记录未定义?
【发布时间】:2021-10-02 11:54:25
【问题描述】:

我编写了下面的代码来为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 的访问能够解析为base 对象的foo 属性,但这不会发生。

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

【问题讨论】:

  • 您编写的代码类似于 Proxy 中的get 方法,但不适用于getPrototypeOf。陷阱需要被触发,MDN 说有五种方法可以做到这一点。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • (这很容易通过在getPrototypeOf 函数中添加console.log 来演示——它不会在sn-p 的流程中执行。)
  • 是的,我最近看到并阅读了一些 ECMAScript 的文档。现在的问题是我如何在 JavaScript 中真正实现这种想法?
  • 我相信你必须实现一个 GET 陷阱来实现这种行为(即委托给其他对象)。
  • @FelixKling 是的,我已经在尝试过了,它奏效了。我只是想知道,在性能方面可以吗?您能否对使用Proxy 的性能方面有所了解?

标签: javascript ecmascript-6 es6-proxy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多