我正在尝试通过模块模式设置私有变量的值。 所以我所说的是将$ content设置为我传递给person.content的值。但这似乎不起作用,因为当我对值进行警报时,它会给我一个未定义的错误。
$(document).ready(function(){
person.content = $('#content');
person.getContent();
});
// Person Module
var person = ( function(){
var $content;
function getContent(){
alert( 'content = '+$content.find(':first h2').text());
}
return {
content: $content,
getContent : getContent,
}
}( ) );
答案 0 :(得分:5)
当你这么说时,你的问题是:
person.content = $('#content');
您不是在更改函数内的var $content;
,而只是更改content
中person
属性的值。然后,当你这样说:
person.getContent();
内部getContent
函数将在外部函数中使用(未初始化的)var $content
。您需要添加setContent
函数:
var person = (function(){
var $content;
function setContent(c) {
$content = c;
}
// ...
return {
setContent: setContent,
getContent: getContent
};
}());
并确保不要在返回对象中留下该逗号,大多数(所有?)版本的IE都会对此感到不安。
然后,在其他地方:
person.setContent($('#content'));
person.getContent();
根据您的目标浏览器和版本,您可以为返回对象的属性定义getter和setter函数:
但是使用显式的mutator函数将无处不在。
答案 1 :(得分:0)
将对象中的值想象为指针。
person
是一个对象,其中content
属性指向闭包中的$content
值。当您执行person.content = somethingElse
时,您将人员对象的content
属性设置为指向somethingElse
。
从中取出封闭,这说明了同样的事情:
var a = 'a';
var b = 'b';
var obj = { a: a }
alert(obj.a) // "a"
obj.a = b;
alert(obj.a) // "b"
alert(a) // "a"
将对象属性设置为新对象,永远不会对曾经在那里分配的对象做任何事情。它只是指向一个新的不同的对象。
分配这个内部私有变量的唯一方法是从闭包内部开始,就像在setContent
方法中一样。
return {
getContent: function() { return $content; },
setContent: function(val) { $content = val; }
};