JavaScript:在 Array Literal 中访问自己的 Object 属性

JavaScript: Access own Object Property inside Array Literal

提问人:Stephan Kristyn 提问时间:7/26/2010 最后编辑:Daniel VassalloStephan Kristyn 更新时间:7/26/2010 访问量:5393

问:

给定 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/

javascript 数组 oop unobtrusive-javascript

评论

0赞 Bergi 2/5/2013
对象文本声明中 Self-references 的可能重复项

答:

2赞 Anurag 7/26/2010 #1

该属性不指向对象。如果我们要在全局范围内定义 myPic 属性,那么你会看到使用该值初始化。请看这个例子:thisclosurepicArray

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

this是 JavaScript 中最难的概念之一。您可能会喜欢这篇关于该主题的文章

10赞 Christian C. Salvadó 7/26/2010 #2

该值不会像那样工作,它指的是由实际执行上下文确定的值,而不是您的对象字面量。this

例如,如果声明对象的函数成员,则可以获得所需的结果:

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

因为函数内部的值将引用您的对象。thisgetPicArrayclosure

请参阅另一个问题的答案,我在其中解释了关键字的行为。this

编辑:作为对您的评论的回应,在我提供的示例中,该方法将在每次调用时生成一个新的 Array 对象,并且由于您想要存储数组并对其进行更改,因此我建议您这样做,分两步构建您的对象:getPicArray

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

然后,您可以毫无问题地修改成员。closure.picArray

评论

0赞 Stephan Kristyn 7/26/2010
谢谢!很好的答案。那么,您将如何持久地修改数组呢?
0赞 Christian C. Salvadó 7/26/2010
@Stephan,谢谢!在我的第二个示例中,您可以简单地使用该属性,例如picArrayclosure.picArray.push("foo");