2013-06-26 36 views
1

我在Chrome浏览器中使用ECMAScript 6代理(需要“启用实验JavaScript”标志)。我粘贴在控制台下面的代码(从here拍摄):为什么Proxy.create返回“TypeError”

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" 

任何人都可以解释为什么personsplice财产被访问两次,为什么我们得到"TypeError"

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

Chrome的探测对象,试图发现它的类型:

+0

所以你只是在代理对象上做'person.splice'?我没有在Firefox中看到这种行为,但我还没有在Chrome中进行过测试。 –

+0

...刚刚在Chrome中测试过,并且它不会产生您在执行'person.splice'时描述的结果。 –

+0

现在我看到我错过了您在控制台中进行测试。这是我的承诺...谁在乎控制台是否有奇怪的东西,只要你的代码按照预期的方式工作就可以了!控制台的实现都有不同程度的吸引力。 –

回答

3

您的问题可以简化。这会触发get陷阱,并且可以通过在get陷阱中添加console.log(arguments.caller.callee);来显示。

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无法将代理转换为可表示的对象。

+0

啊,所以OP在控制台中测试代码。我真的希望人们不会这么做......或者至少会在发布问题之前在纯粹的环境中进行测试。 +1 –

相关问题