При использовании JavaScript или TypeScript проверка того, является ли объект instanceofдругим объектом, является довольно распространенным способом определения его типа. Но что происходит, когда вы уверены, что объект является экземпляром другого объекта, но проверка instanceof возвращает false?

При использовании такого пакета, как JSDom, вы заметите, что любой JavaScript, выполняемый в его экземпляре, получает другой window и, следовательно, выполняется в другом контексте.

Давайте представим, что вы выдаете ошибку в JSDom и присваиваете ее переменной err. Вне JSDom мы хотим проверить, является ли err экземпляром Error, что мы и делаем следующим образом err instanceof Error.

Если исходный err создан в другом контексте, эта проверка вернет false.

Это связано с тем, что instanceof перемещается вниз по цепочке прототипов, проверяя, является ли экземпляр, который мы проверяем, нашей переменной (err) одним из прототипов.

Но при использовании разных контекстов объект Error, найденный в нашей цепочке прототипов err, не указывает на тот же объект Error в выражении instanceof Error, поскольку он находится в другом контексте.

Таким образом, решение состоит в том, чтобы вместо этого использовать утиную печать, чтобы проверить соответствие структуры наших двух ошибок.

Это сработает и правильно проверит, является ли ваш объект instanceof Error, даже если ваша ошибка возникает в другом контексте.