模块模式中的构造函数

Constructors in the Module Pattern

本文关键字:构造函数 模式 模块      更新时间:2023-09-26

在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());

您的代码几乎很好。然而,函数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/

使用varfunction foo() {}(后者作为声明,意思是"仅"function foo() {}而不分配它)创建本地符号。因此,该函数在构造函数之外不可用。

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

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

注意,您已经使用了name,所以我给函数起了另一个名字。如果您想使name字符串成为本地字符串,并公开函数,那么它们可以具有相同的名称,因为没有冲突。例如:

var name = "john";
self.name = function() {
    return name;
};

您需要拿出该方法,并将其附加到Person原型。但是当你这样做的时候,你会有一个name属性和一个name方法,这是不起作用的,所以考虑重命名后一个

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

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

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