Итак, я играл с прокси-объектами и, пытаясь увидеть, как они сочетаются с синтаксисом распространения и деструктурированием, я наткнулся на это странное поведение:
const obj = {
origAttr: 'hi'
}
const handler = {
get(target, prop) {
console.log(prop);
return 1;
},
has(target, prop) {
return true;
},
ownKeys(target) {
return [...Reflect.ownKeys(target), 'a', 'b'];
},
getOwnPropertyDescriptor(target, key) {
return {
enumerable: true,
configurable: true
};
}
}
const test = new Proxy(obj, handler);
const testSpread = { ...test};
console.log('Iterate test');
// Works OK, output as expected
for (const i in test) {
console.log(i, ' -> ', test[i]);
}
console.log('Iterate testSpread');
// Also works OK, output as expected
for (const i in testSpread) {
console.log(i, ' -> ', testSpread[i]);
}
console.log('Here comes the unexpected output from console.log:');
console.log(test); // All attributes are 'undefined'
console.log(testSpread); // This is OK for some wierd reason
Приведенный выше вывод скрипта (на узле v10.15.1):
Вот неожиданный вывод из журнала консоли:
Symbol(nodejs.util.inspect.custom)
Symbol(Symbol.toStringTag)
Symbol(Symbol.iterator)
{ origAttr: undefined, a: undefined, b: undefined }
{ origAttr: 1, a: 1, b: 1 }
Почему console.log(test); вывод показывает, что все атрибуты объекта не определены? Это может вызвать серьезную головную боль, если это произойдет при отладке чего-либо.
Это ошибка в самом узле или, возможно, в реализации console.log?
console.log(prop)
внутрь ловушкиget
, чтобы увидеть, какие свойства она перехватывает и сколько раз она это делает? - person Patrick Roberts   schedule 11.03.2019console.log()
, сколько с тем, как прокси-объект перехватывает свойства, к которым неявно обращаются через синтаксис распространения объекта в Node v10.15.1, по крайней мере, это кажется источником ошибки. - person Patrick Roberts   schedule 11.03.2019testSpread
выглядело бы странно. Или распространение каким-то образом уничтожает прокси. - person Jonas Wilms   schedule 11.03.2019