模块模式中的构造函数

时间:2012-01-19 16:15:59

标签: javascript constructor prototype module-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 个答案:

答案 0 :(得分:3)

你的代码几乎没问题。但是函数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/

答案 1 :(得分:2)

使用varfunction foo() {}(后者作为声明,即“仅”function foo() {}而不指定它),创建本地符号。因此,该函数在构造函数外部不可用。

无论您希望公开什么(公开),都应该分配到this(或self,因为您定义了self = this):

self.getName = function() {
    return self.name;
};

请注意,您已使用name,因此我给了函数另一个名字。如果您想将name字符串设置为local,并公开该函数,那么它们可以具有相同的名称,因为没有冲突。 E.g:

var name = "john";

self.name = function() {
    return name;
};

答案 2 :(得分:1)

您需要将该方法取出,并将其附加到Person原型。但是当你这样做时,你将拥有一个名称属性和一个名称方法,这将无效,所以考虑重命名后者

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

或者,您可以将其附加到this,并使getName成为特权方法:

  Person: function() {
        this.name = "john";
        this.getName = function() {
            return this.name;
        }
    }