6

JavaScript オブジェクト内の配列リテラルを指定すると、独自のオブジェクトのプロパティへのアクセスが機能しないようです。

 var closure =  {

         myPic : document.getElementById('pic1'),
         picArray: [this.myPic]
 }    

 alert(closure.picArray[0]); // alerts [undefined]


他のJavaScriptオブジェクトにアクセスして配列アイテムを宣言するとうまくいくようですが

 ​var closure1 = {
 ​    
 ​     myPic : document.getElementById('pic1')
 ​}
 ​    
 ​var closure2 =  {
 ​  
 ​        picArray: [closure1.myPic]
 ​}    
 ​    
 ​alert(closure2.picArray[0]); // alerts [object HTMLDivElement]


例: http://jsfiddle.net/5pmDG/

4

2 に答える 2

10

値はそのthisようには機能しません。オブジェクト リテラルではなく、実際の実行コンテキストによって決定される値を参照します。

たとえば、オブジェクトの関数メンバーを宣言すると、目的の結果が得られます。

var closure =  {
  myPic: document.getElementById('pic1'),
  getPicArray: function () {
    return [this.myPic];
  }
};
//...
closure.getPicArray();

this関数内の値はオブジェクトgetPicArrayを参照するためです。closure

別の質問に対するこの回答を参照してくださいthis。キーワードの動作について説明しています。

編集:あなたのコメントに応えて、私が提供した例では、getPicArrayメソッドは呼び出されるたびに新しい Array オブジェクトを生成します。配列を保存して変更したいので、お勧めしますこのように、2 つのステップでオブジェクトを構築します。

var closure =  {
  myPic: document.getElementById('pic1')
};
closure.picArray = [closure.myPic];

その後、closure.picArray問題なくメンバーを変更できます。

于 2010-07-25T19:42:43.113 に答える
2

プロパティがオブジェクトthisを指していません。closureグローバル スコープで myPic プロパティを定義するpicArrayと、その値で初期化されていることがわかります。次の例を検討してください。

<script>
window.myPic = "Global myPic";

var closure =  {
    myPic : document.getElementById('pic1'),
    picArray: [this.myPic] // this refers to the global object
};

console.log(closure.picArray); // ["Global myPic"];
</script>

thisJavaScript で最も難しい概念の 1 つです。このトピックに関するこの記事が好きかもしれません。

于 2010-07-25T19:40:26.340 に答える