5

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

3 回答 3

3

Your code is almost fine. However the function name() was not public but the variable was so you were trying to execute the variable causing an error. Add the function getName onto the object and call that instead:

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/

于 2012-01-19T16:25:20.313 回答
2

使用varand function foo() {}(后者作为声明,这意味着“只是”function foo() {}而不分配它),创建局部符号。因此,该函数在构造函数之外不可用。

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

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

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

var name = "john";

self.name = function() {
    return name;
};
于 2012-01-19T16:23:24.233 回答
1

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

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

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

  Person: function() {
        this.name = "john";
        this.getName = function() {
            return this.name;
        }
    }
于 2012-01-19T16:22:42.733 回答