1

我在 Chrome 中使用 ECMAScript 6 代理(需要“启用实验性 JavaScript”标志)。我在控制台中粘贴了以下代码(取自此处):

var loggable = function(obj, logger) {
  return Proxy.create({
      get: function get(receiver, prop) {
          logger.info('Getting ' + prop);
          return obj[prop];
      }
  });
};

var person = { name: 'Alice', age: 22 };
person = loggable(person, {
  info: function info(str) {
      console.log(str);  
  }
});

结果是:

Getting splice
Getting splice
"TypeError"

谁能解释为什么 的splice属性person被访问两次,以及为什么我们得到"TypeError"

4

1 回答 1

3

您的问题可以简化为:

Proxy.create({
    get: function get(receiver, prop) { console.log(prop); }
});

Chrome 会探测对象以尝试发现其类型。这会触发get陷阱,并且可以通过添加陷阱来console.log(arguments.caller.callee);揭示get

    get: function get(receiver, prop) { console.log(arguments.caller.callee); }

产生http://pastebin.com/Fr3ACkJ8。最重要的一行是:

        if (typeof obj.splice === "function" && isFinite(obj.length))
            return "array";

这表明试图访问该splice属性,被您的get陷阱捕获。最后TypeError被记录是因为 Chrome 无法将代理转换为可表示的对象。

于 2013-06-26T17:43:40.183 回答