Что должен вернуть конструктор JavaScript, если он потерпит неудачу? - PullRequest
36 голосов
/ 01 марта 2011

Если у меня есть класс javascript, который не может быть создан, что должен вернуть конструктор, который я могу проверить.Конструктор всегда возвращает объект, поэтому я не могу вернуть ноль, если конструктор завершился неудачей.

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
}

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

Ответы [ 4 ]

35 голосов
/ 01 марта 2011

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

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

Мой совет - сломаться и сломаться в ближайшее время. Это сделает нарушения контракта очень очевидными во время тестирования.

26 голосов
/ 01 марта 2011

Возврат любого необъекта из конструктора практически совпадает с выходом из конструктора.(Конструктор вернет новый объект с prototype, если он был указан.)

Итак, возвращение null, undefined или 42 из конструктора эквивалентно.

Ознакомьтесь с разделом 13.2.2 спецификации ECMAScript (pdf) для получения дополнительной информации.

12 голосов
/ 01 марта 2011

Мой первый подход:

  1. Не разрешать сбою конструктора; рассмотреть альтернативы

Мой второй подход:

  1. Если конструктор дает сбой, он должен выходить из строя только из-за ошибки программирования и, следовательно,
  2. должен выдать исключение и;
  3. не должен возвращать «код состояния» (см. Ответ Эммета, почему возвращение null не работает в любом случае)

Я никогда не проектировал конструктор (что-то, вызываемое в качестве цели new) для возврата чего-либо, кроме объекта «ожидаемого» типа.

Быстрый сбой, избегайте слишком умного и сэкономьте время на отладке труднодоступных ошибок.

Удачного кодирования.

3 голосов
/ 25 февраля 2013

Используйте я страж. Мне нравится

return {invalid:true};

Это выглядит чисто:

var x = new X();
if (x.invalid) { // ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...