2011-06-30 14 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

あなたの問題は、あなたが、これが言うとき:あなたが関数内var $content;を変更していない

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

、あなただけのpersoncontentプロパティの値を変更しています。その後、あなたはこれを言うとき:

person.getContent(); 

インナーgetContent関数は外側の関数内(初期化されていない)var $contentを使用することになります。

var person = (function(){ 
    var $content; 
    function setContent(c) { 
     $content = c; 
    } 
    // ... 
    return { 
     setContent: setContent, 
     getContent: getContent 
    }; 
}()); 

そして、あなたはあなたのリターンオブジェクトにカンマを末尾に、IEのほとんど(全て?)のバージョンはそのことについて怒ることを残していないことを確認してください:あなたはsetContent機能を追加する必要があります。他の場所

そして、:

person.setContent($('#content')); 
person.getContent(); 

ターゲットブラウザやバージョンによっては、あなたが返されるオブジェクトにプロパティのゲッターとセッター関数を定義することができます。

明示的なミューテータ機能を使用すると、どこでも動作します。

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; } 
}; 
関連する問題