为什么console.log不会触发代理getter陷阱?

时间:2019-04-11 10:34:01

标签: javascript

我有以下代码:

let p = new Proxy([1, 2, 3], {   
  get: function() {   
    console.log('get')   
  }   
})
console.log(p)

我认为Proxy应该代理{strong>关于[1,2,3]的一切。

当我log的值时,它应该从[1,2,3]读取值,因此应该触发吸气剂。

但是当我在吸气剂中设置一个断点时,该断点没有被击中吗?

console.logconsole.table为什么不触发吸气功能?

2 个答案:

答案 0 :(得分:2)

那是因为您正在记录Proxy对象本身。
浏览器控制台可以访问其内部状态,该状态是具有两个或三个内部属性的对象:[[target]][[handler]][[IsRevoked]]

您可能会注意到,默认情况下,Chrome确实会在其折叠的消息中展开[[target]]

console output of Chrome

,而Firefox选择默认情况下仅公开(并且不公开内部[[isRevoked]],它们将<target><handler>设置为null来表示已撤销的代理)。
enter image description here

为了如何,他们不能触发陷阱,所以他们采取了内部[[target]]快捷方式并直接访问原始对象。

答案 1 :(得分:1)

在这种情况下,实际上未指定控制台的行为,这取决于您的引擎是否达到陷阱。 NodeJS does for example

IMO chromes不触发陷阱的方法更好。我希望控制台成为代码的独立观察者,如果它改变了代码的行为方式,调试将变得更加痛苦(“陷阱是由某些代码还是由控制台触发的?”)。