Конструкторы в модуле 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());

http://jsfiddle.net/8nSbP/

С помощью 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;
};
Другие вопросы по тегам