为什么Proxy.create返回“TypeError”

时间:2013-06-26 16:59:28

标签: javascript google-chrome

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

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的{​​{1}}属性被访问两次,为什么我们得到person

1 个答案:

答案 0 :(得分: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无法将代理转换为可表示的对象。