Что должен возвращать конструктор JavaScript, если он терпит неудачу?
Если у меня есть класс javascript, который не может быть создан, что должен вернуть конструктор, для которого я могу проверить. Конструктор всегда возвращает объект, поэтому я не могу вернуть значение null, если конструктор не работает.
function SomeClass(id) {
if(typeof(id) === 'number' {
// This is good
this.id = id;
} else {
// This is bad
// This return is ignored and an empty object is returned
return null;
}
}
var a = new SomeClass('badParam');
if(a){
// is true even though the class expects a number.
}
// Could use this check
if(a.id !== undefined){
// Do some stuff
}
но кажется, что должен быть лучший способ.
Ответы
Ответ 1
Вероятно, лучше всего создать исключение, чтобы уведомить вызывающего абонента о неудачной инициализации и предпринять соответствующие действия.
Коды возврата являются точными, но по большей части нет мотивации для того, чтобы вызывающий выполнял проверки кода возврата.
Мой совет - сильно ломать голову и ломаться. Это сделает нарушения контракта очевидными во время тестирования.
Ответ 2
Возврат любого объекта из конструктора практически не отличается от выхода из конструктора. (Конструктор вернет новый объект с prototype
, если он был указан.)
Итак, возврат null
, undefined
или 42
из конструктора эквивалентен.
Подробнее см. раздел 13.2.2 Спецификация ECMAScript (pdf).
Ответ 3
Мой первый подход:
- Не разрешать конструктору сбой; рассмотреть альтернативы
Мой второй подход:
- Если конструктор выходит из строя, он должен только терпеть неудачу из-за ошибки программирования и, следовательно,
- должен генерировать исключение и
- не должен возвращать "код состояния" (см. ответ Emmett, почему возврат
null
не работает)
Я никогда не проектировал конструктор (что-то вызываемое как цель new
), чтобы возвращать что-либо, кроме объекта "ожидаемого" типа.
Сбой быстро, не слишком умный и экономя время отлаживая труднодоступные ошибки.
Счастливое кодирование.
Ответ 4
Используй я стражу. Мне нравится
return {invalid:true};
Это выглядит чисто:
var x = new X();
if (x.invalid) { // ...
(Невозможно возвратить неверное значение из конструктора, поэтому вы не можете поместить новый в условный, как вы могли бы с другим языком.)