Erro de subclasse em JavaScript é mais difícil do que parece

Infelizmente Error()função em JS não é um construtor típico e métodos padrão com Error.call(this)ou Error.apply(this)será não funcionar corretamente. Da especificação :

15.11.1 O Construtor de Erro Chamado como uma Função

Quando Error é chamado como uma função em vez de um construtor, ele cria e inicializa um novo objeto Error. Assim, a chamada de função Error (…) é equivalente à expressão de criação de objeto new Error (…) com os mesmos argumentos.

A próxima melhor coisa que você pode fazer é fingir que criou uma subclasse e, em seguida, copiar as propriedades desejadas:

function HttpError(code, msg) {
this.message = msg;
this.statusCode = code;
this.name = 'HttpError';
const err = Error(msg); // http://es5.github.io/#x15.11.1
this.stack = err.stack;
}

HttpError.prototype = Object.create(Error.prototype);
HttpError.prototype.constructor = HttpError;

O código acima passa nestes testes:

const err = new HttpError(404, "Test");

assert(err instanceof Error);
assert(err instanceof HttpError);
assert.equal(err.name, 'HttpError');
assert.equal(err.statusCode, 404);
assert(util.isError(err));
// These would fail if you relied on Error.call(this, msg)
assert.include(err.stack, __filename);
assert.equal(err.message, 'Test');