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