2011-06-30 73 views
2

我试图通过模块模式设置私有变量的值。 所以我说的是将$ 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, 

     } 

    }()); 

回答

5

你的问题是,当你这样说:

person.content = $('#content'); 

你不改变var $content;里面的功能,你只是改变personcontent属性的值。然后,当你这样说:

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函数的性质:

但使用一个明确的突变基因功能将工作无处不在。

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; } 
};