在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());
答案 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());
答案 1 :(得分:2)
使用var
和function 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;
}
}