Вы не можете сделать это, и удовлетворить требования вопроса.
Почему?
Проблема в получении стека. Собственный объект ошибки (с этого момента NativeError) инициализирует стек при вызове его конструктора. Чтобы получить стек в MyError (ваш подкласс ошибок), вы должны вызвать NativeConstructor внутри конструктора MyError. Итак, ваш класс MyError выглядит примерно так:
function MyError(msg) {
Error.call(this, msg);
}
Но это не работает. Потому что согласно HTML5 spec:
«если вы вызываете Error как функцию, она возвращает новый объект Error».
Вместо того, чтобы конструктор Error был красивым и инициализировал ваш собственный класс ошибок, он создает объект ошибки, который вам не нужен. Я не нашел способ вызвать конструктор NativeError и заставить его инициализировать подкласс MyError.
Не все потеряно.
Если мы ослабим требования исходного вопроса и забудем об «instanceof», чтобы протестировать класс исключений (так или иначе, Java), и вместо этого будем использовать «name», это можно сделать. Просто объявите MyError как:
function MyError(msg, customArg) {
var e = new Error(msg);
e.name = "MyError";
e.custom = customArg;
return e;
}
Это то, что я делаю. Вместо включения «instanceof» вместо этого включите «name».