Функция прокси-сервера Javascript предлагает некоторые интересные функции для отладки. Например, вы можете «защитить» объект, поставив его за прокси с обработчиком get
, который выдает, если вы получаете доступ к неопределенному свойству. Это помогает улавливать опечатки и другие ошибки.Равенство между прокси и целевым объектом
Это может быть использовано что-то вроде этого:
class Something {
constructor()
{
this.foo = "bar";
allObjects.push(this);
}
};
function defend(o)
{
return new Proxy(o, DebugCheckHandler);
};
let rawSomething = new Something();
let defendedSomething = defend(rawSomething);
Код может быть тщательно записаны только сделки с точки зрения defendedSomething
. Однако в этом примере конструктор Something
передает this
где-то в другом месте (до allObjects
). Это заканчивается тем же эффектом, что и использование rawSomething
и defendedSomething
через кодовую базу.
Проблемы возникают из-за того, что ссылка прокси не равна ее исходной ссылке, начиная с rawSomething !== defendedSomething
. Например, allObjects.includes(defendedSomething)
вернет false, если он содержит rawSomething
, потому что includes
выполняет строгую проверку ===
.
Есть ли хороший способ решить эту проблему без внесения слишком большого количества изменений в код?
Одна проблемы состоит в том, если 'DebugCheckHandler' бросает на установление несуществующих свойств, он будет бросать, как конструктор добавляет свойство объекта. – AshleysBrain
@AshleysBrain Тогда заставьте его не бросить? Или, может быть, 'var p = new Proxy (новый C(), DebugCheckHandler)', если вы не против нажатия на ненужный объект для 'allObjects'. Или 'var p = new Proxy (Object.assign (Object.create (C.prototype), {foo: void 0}), DebugCheckHandler)', если вы сейчас являетесь собственностью. – Oriol
Я ищу решение, которое позволяет избежать отладки проверки отладки, когда-либо обнаруживающей ложные срабатывания в конструкторах, никогда не подталкивает бесполезный объект для allObjects и не требует полностью переписывания конструкторов или иным образом использует значительно другой стиль. – AshleysBrain