Я создаю виртуализированный объект, который лениво создает свои свойства с помощью механизма правил, чтобы пропустить вычисление значений, которые никогда не считываются. Для этого я использую файл Proxy
. Похоже, что прокси выполняют двойную функцию как для переадресации доступа, так и для виртуализации; в моем случае меня больше волнует последнее, а не первое.
Проблема, с которой я столкнулся, связана с попыткой реализовать ловушку getOwnPropertyDescriptor
в прокси. При этом я получаю сообщение об ошибке:
TypeError: 'getOwnPropertyDescriptor' на прокси-сервере: ловушка возвращает дескриптор для свойства 'foo', который несовместим с существующим свойством в целевом прокси-сервере.
Поскольку на самом деле я не перенаправляю запросы на обернутый объект, я использовал Object.freeze({})
в качестве первого аргумента, передаваемого new Proxy(...)
.
function createLazyRuleEvaluator(rulesEngine, settings) {
const dummyObj = Object.freeze({});
Object.preventExtensions(dummyObj);
const valueCache = new Map();
const handlers = {
get(baseValue, prop, target) {
if (valueCache.has(prop))
return valueCache.get(prop);
const value = rulesEngine.resolveValue(settings, prop);
valueCache.set(prop, value);
return value;
},
getOwnPropertyDescriptor(baseValue, prop) {
return !propIsInSettings(prop, settings) ? undefined : {
configurable: false,
enumerable: true,
get() {
return handlers.get(baseValue, prop, null);
}
};
},
};
return new Proxy(dummyObj, handlers);
}
// This throws
Object.getOwnPropertyDescriptor(createLazyRuleEvaluator(/*...*/), 'foo');
Прокси-объект должен напоминать объект со свойствами только для чтения, которые не могут быть расширены или иметь какие-либо другие подобные причудливые формы. Я попытался использовать замороженный и нерасширяемый объект, но мне все еще говорят, что дескриптор свойства несовместим.
Когда я пытаюсь использовать незамороженный объект в качестве цели прокси, я получаю ошибку другого типа:
TypeError: «getOwnPropertyDescriptor» на прокси: ловушка сообщила о невозможности настройки для свойства «foo», которое либо не существует, либо настраивается в цели прокси
Что я здесь делаю неправильно? Можно ли каким-либо образом сделать так, чтобы мой прокси не настраивался?
has
илиset
. - person Bergi   schedule 11.12.2019