我认为我有点理解JS代理对象的行为,但我遇到了一些奇怪的效果。
我定义了一个简单的处理程序,它通过检查以下内容来覆盖get():
检查对象属性是否为私有(此处定义为“以下划线开头”)=>返回值'private'
检查对象属性是否已定义=>如果不是,则返回值42而不是值。
这是我定义处理程序的方式:
var handler = {
get: function(target, property){
if (property.indexOf('_') === 0) {
return 'private';
}
else {
return property in target ? target[property] : 42;
}
}
};
然后,我在两种不同的情况下使用处理程序。
首先,我使用代理来定义对象父,这样就可以了:
const parent = new Proxy({}, handler);
parent._a = 10;
parent.b = 20;
console.log(parent._a, parent.b); // outputs: private, 20 -- OK!
console.log('c' in parent, parent.c); // outputs: false, 42 -- OK!
其次,我创建了一个从父派生的对象 p ,这里有一些我不理解的奇怪行为:
const p = Object.create(parent);
p._a = 1;
p.b = 2;
console.log(p._a, p.b); // outputs: 1, 2 <--- why is this not caught by the proxy?
console.log('c' in p, p.c);// outputs: false, 42 <--- why is this caught by the proxy?
我会理解,如果没有应用于p的getter被困在代理中,但为什么 pc 调用被困,而 p._a 不是?