@sanex3339

Где и как правильнее объявлять переменные?

Допустим есть код (шаблон модуль, вроде), в котором есть переменная, использующаяся в нескольких функциях:
new function() {
	var module = function () {
		var moduleObject = {
			init: function () {
				console.log(myAmazingVariable);
				/* CODE */
			},
			events: function () {
alert(myAmazingVariable);
				/* CODE */
			}
		};
		moduleObject.init();
	};
	return module();
}();


Где правильнее объявлять общие для модуля переменные в таком случае?
1)
new function() {
	var module = function () {
		var moduleObject = {
			vars: {
				myAmazingVariable = 'myAmazingValue'
			},
			init: function () {
				console.log(this.vars.myAmazingVariable);
				/* CODE */
			},
			events: function () {
				alert(this.vars.myAmazingVariable);
				/* CODE */
			}
		};
		moduleObject.init();
	};
	return module();
}();


2)
new function() {
	var module = function () {
		var moduleObject = {
			myAmazingVariable: 'myAmazingValue',
			init: function () {
				console.log(this.myAmazingVariable);
				/* CODE */
			},
			events: function () {
				alert(this.myAmazingVariable);
				/* CODE */
			}
		};
		moduleObject.init();
	};
	return module();
}();


3)
new function() {
	var module = function () {
		var myAmazingVariable = 'myAmazingValue';

		var moduleObject = {
			init: function () {
				console.log(myAmazingVariable);
				/* CODE */
			},
			events: function () {
				alert(myAmazingVariable);
				/* CODE */
			}
		};
		moduleObject.init();
	};
	return module();
}();
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
Не вариант 1 это точно.

2 или 3 зависит от того на сколько точно вы сформулировали вопрос:
Если вас интересуют именно переменные, которые будут использоваться только внутри модуля, то вам нужен вариант 3 - это общепринятая на данный момент практика объявления приватных полей и методов класса в js.

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

Ваш код можно переписать следующим образом:

new function() {
  var privateStaticVariable = 'privateStaticValue';

  function Module(num) {
    Object.defineProperty(this,  '_privateOption',  {
       value: 'privateValue' + num,
       enumerable: false,
       configurable: true,
       writable: true
    });

    this.publicOption = 'publicValue';
  };

  Module.prototype.init = function() {
     console.log(privateStaticVariable);
     console.log(this._privateOption);
     console.log(this.publicOption);
  };

  Module.prototype.events= function() {
  };

  var module1 = new Module(1);
  var module2 = new Module(2);

  module1.init();
  module2.init();

  return module1;
};


Использование new function это моветон, но раз уж вам так хочется...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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