Javascript, раскрывающий шаблон модуля

Я изо всех сил пытаюсь понять преимущества шаблона раскрывающегося модуля. Возьмите ф.э. следующий код:

var Person = function(name){
  this.name = name;
  var priv = 'secret';
}

var OtherPerson = function(name){
  var name = name;
  var priv = 'secret';
  return({name: name});
}

duke = new Person('john');
dust = new OtherPerson('doe');

Насколько мне известно, OtherPerson должен быть классическим раскрывающим модулем, поскольку я нашел его на различных ресурсах в Интернете. Так в чем же разница между Person и OtherPerson?

Лично я считаю, что Person выглядит намного чище, и вы можете легче видеть свои частные и общедоступные переменные.


person Jannic Beck    schedule 02.12.2015    source источник


Ответы (2)


Хорошо,

  • duke is a Person
  • dust не OtherPerson

В JavaScript:

instanceof duke === Person // true
instanceof dust !== AnotherPerson // true

Шаблон Person может быть полезен для создания объекта, который будет создан, и который также может быть модулем. Конструктор OtherPerson, с другой стороны, возвращает только простой объект JavaScript, поэтому нет смысла создавать его позже. Тем не менее, модуль, который не является конструктором объекта, может использовать этот шаблон (например, функция, которая использует другие локально определенные данные).

person Pandaiolo    schedule 02.12.2015

Шаблон модуля дает вам возможность скрыть ваши частные переменные и методы. Вариант реализации Revealing Module Pattern дает вам возможность легко изменить свой код, чтобы переключиться с частного на общедоступный и наоборот, но в значительная стоимость. См. этот ответ для различия в реализации паттерна модуля, но суть в том, что паттерн раскрывающегося модуля ведет себя плохо в отношении переопределения и прототипного наследования.

Ваш OtherPerson является примером шаблона раскрывающегося модуля. Ваш Person является классическим JavaScript, однако, в зависимости от того, как вы реализуете более сложный пример, его можно использовать как исходную реализацию паттерна модуля в отношении обычного переопределения и переопределения прототипа. Чем шаблон модуля отличается от вашего примера, так это тем, что шаблон модуля избегает использования ключевого слова new, которое многие люди ненавидят, и что организация шаблона модуля упрощает просмотр того, какие методы являются общедоступными, а какие — частными.

person I-Lin Kuo    schedule 02.12.2015