Задать вопрос

Как в JavaScript проверить непосредственного потомка класса (конструктора)?

Есть коллекция исключений, наследующая прототип конструктора Error, нужно как-то проверять брошенное исключение, что оно является непосредственным потомком исключения.

Попытка проверки с помощью instanceof даёт в обоих результатах: true, как я понял — это потому, что они оба наследуют прототип Error-а:
var err = new object.exceptions.IncorrectLink();
console.log(err instanceof object.exceptions.IncorrectLink); // true
console.log(err instanceof object.exceptions.Timeout); // true

Список исключений:
var object = { exceptions: {} };

object.exceptions.IncorrectLink =
function IncorrectLink(message, type) {
	Error.call(this);
	this.name = 'IncorrectLink';
	if (message) {
		this.message = message;
	} else {
		this.message = 'Incorrect "link" argument';
		if (type) this.message += ' ("'+ type +'")';
		this.message += ', must be a "string"';
	}
};

object.exceptions.Timeout =
function Timeout(message) {
	Error.call(this);
	this.name = 'Timeout';
	this.message = message || 'Loading timeout';
};

for (var key in object.exceptions) {
	object.exceptions[key].prototype = Error.prototype;
}
  • Вопрос задан
  • 2852 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Что-то в стиле
Object.getPrototypeOf(err) === object.exceptions.IncorrectLink.prototype

upd: хотя нет, стоп, последней строчки не увидел. Прототип-то у них один, по сути они являются инстансами одного конструктора, на которые были применены разные функции. Либо менять архитектуру, либо весить метку. По хорошему - использовать разные прототипы, например
object.exceptions[key].prototype = Object.create(Error.prototype);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Anonym
@Anonym
Программирую немного )
Читаем тут тут и тут.
Самое простое решение - делать так:
object.exceptions.IncorrectLink =
function IncorrectLink(message, type) {
        this.constructor = object.exceptions.IncorrectLink;
	// ...
};

jsfiddle.net/7nWfB/1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы