Конструкторы в модуле Pattern - PullRequest
5 голосов
/ 19 января 2012

При использовании шаблона модуля в 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 ]

3 голосов
/ 19 января 2012

Ваш код почти в порядке.Однако функция 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/

2 голосов
/ 19 января 2012

Используя 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;
};
1 голос
/ 19 января 2012

Вам нужно вывести метод и прикрепить его к прототипу Person. Но когда вы это сделаете, у вас будет свойство name и метод name, который не будет работать, поэтому подумайте о переименовании последнего

HOUSE.Person.prototype.getName = function(){
    return this.name;
}

ИЛИ, вы можете просто прикрепить его к this и сделать getName привилегированным методом:

  Person: function() {
        this.name = "john";
        this.getName = function() {
            return this.name;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...