@vasIvas

Какие минусы у Module?

Начиная постигать js, мне сразу дали понять, что конструкция -
function Test( ){
	// ...
}

Test.prototype = {
	method: function( ){
		
	}
};


лучше чем -
function Test( ){
	// ...
}

Test.prototype.method = function( ){
	
};

И я это принял как должное. Затем я понял, что не могу обходится без private и меня направили по пути "модуля". И вот сейчас у меня возник вопрос по поводу "правильности" использования модуля. Первое что меня интересует - если я пишу вот так -
( function( args ){
	_private = function( ){

	};
	return {
		public: function( ){
			
		}
	};
} );

то при создании объекта получится, что весь код я написал в конструкторе?
И если да, то насколько это плохо и какие есть минусы у модуля вообще?
  • Вопрос задан
  • 2169 просмотров
Решения вопроса 2
1. Первая конструкция хуже второй - в ней, вместе с прототипом, переопределяется свойство constructor, на которое, обычно, наплевать, но иногда оно может помочь определить конструктор инстанса.
2. _private ни капли не приват без var.
3. Это IIFE, а не конструктор - вызывается без new, одноразовая фабрика. Минусы - по сравнению с чем?

UPD: Я так понимаю, вам хочется приватных данных и функций у инстансов. Верните конструктор из замыкания. Примерно так:
var Test = function(){
  function Test(privateData, publicData){
    this.publicData = publicData;
    this.instanceFn = function(){
      console.log('Публичный метод инстанса');
      privateFn(privateData);
    }
  }
  Test.prototype.protoFn = function(data){
    console.log('Публичный метод прототипа');
    privateFn(this.publicData);
  }
  function privateFn(data){
    console.log('Приватная функция:', data);
  }
  return Test;
}()

var test = new Test('Приватные данные', 'Публичные данные');
console.log(test.publicData); // => Публичные данные
test.instanceFn(); // => Публичный метод инстанса, Приватная функция: Приватные данные
test.protoFn(); // => Публичный метод прототипа, Приватная функция: Публичные данные

Минус - методы инстанса, работающие с приватными данными, создаются каждый раз при вызове конструктора. В ES5 иначе никак, разве что публичные "приватные" свойства, что якобы не замечаем. В ES6 с приватными данными полегче - есть Symbol и WeakMap.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
то при создании объекта получится, что весь код я написал в конструкторе?

Если вы это замыкание вызываете через new, то да, вы делаете все в конструкторе безымянного объекта.

Разберитесь с тем что такое конструктор и вообще прототипное наследование и вопросы отпадут.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Функция становится конструктором, если ее вызывают с new. Если нет -- то просто создает новую область видимости.
P.S. т.н. revealing module -- ни разу не design pattern.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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