Подтвердить что ты не робот

Что должен возвращать конструктор 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
}

но кажется, что должен быть лучший способ.

4b9b3361

Ответ 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) { // ...

(Невозможно возвратить неверное значение из конструктора, поэтому вы не можете поместить новый в условный, как вы могли бы с другим языком.)