Конструкторы в модуле Pattern
При использовании шаблона модуля в javascript, как должны быть определены конструкторы, если они вообще есть. Я хотел бы, чтобы мой конструктор вписывался в стандартный шаблон модуля и не был глобальным.
Почему что-то не нравится в этой работе, это полная чепуха?
var HOUSE = function() {
return {
Person: function() {
var self = this;
self.name = "john";
function name() {
return self.name;
}
}
};
}();
var me = new HOUSE.Person();
alert(me.name());
3 ответа
Вам нужно вывести метод и прикрепить его к прототипу Person. Но когда вы это сделаете, у вас будет свойство name и метод name, который не будет работать, поэтому подумайте о переименовании последнего
HOUSE.Person.prototype.getName = function(){
return this.name;
}
ИЛИ, вы можете просто прикрепить его к this
и сделайте getName привилегированным методом:
Person: function() {
this.name = "john";
this.getName = function() {
return this.name;
}
}
Ваш код почти в порядке. Однако функция name()
не был общедоступным, но переменная была, поэтому вы пытались выполнить переменную, вызвавшую ошибку. Добавить функцию getName
на объект и вызвать его вместо этого:
var HOUSE = function() {
return {
Person: function() {
var self = this;
self.name = "john";
self.getName = function() {
return self.name;
}
}
};
}();
var me = new HOUSE.Person();
alert(me.getName());
С помощью var
а также function foo() {}
(последнее как декларация, что означает "просто" function foo() {}
не назначая его), создавать локальные символы. Таким образом, функция недоступна за пределами конструктора.
Все, что вы хотите выставить (обнародовать), вы должны назначить this
(или же self
так как вы определили self = this
):
self.getName = function() {
return self.name;
};
Обратите внимание, что вы уже использовали name
Поэтому я дал функции другое имя. Если вы хотите сделать name
строка локальная, и выставить функцию, тогда они могут иметь одно и то же имя, так как нет конфликта. Например:
var name = "john";
self.name = function() {
return name;
};