2012-01-30 113 views
0

我似乎遇到了對象「屬性」範圍的問題。我想將Message對象的每個titlemessage屬性輸出到select元素,但它是不能工作!我在做什麼錯誤JavaScript對象屬性不在範圍內

<html><head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script> 
<script type="text/javascript"> 
$(function(){ 
    function Message(title, message) { 
     this.title=title; 
     this.message=message; 
     this.getTitle = function(){ 
      return this.title; 
     }; 
     this.getMessage = function(){ 
      return this.message; 
     }; 
    } 
    var messages = new Array(
     new Message("First Title", "This is the first message"), 
     new Message("Second Title", "This is another message") 
    ); 
    function updateSelect() { 
     $("#cannedMessages_button").empty(); 
     for (c in messages) { 
      // First try, with getters and setters 
      $("#cannedMessages_button").append($('<option>', { value : c.getMessage() , text : c.getTitle() })); 
      // Second try, directly 
      $("#cannedMessages_button").append($('<option>', { value : c.message , text : c.title })); 
     } 
    } 
    updateSelect(); 
}); 
</script> 
</head><body> 
<form><select id="cannedMessages_button"></select></form> 
</body></html> 

我可以驗證的foreach實際上是在運行兩個迭代,但我不能獲取值了對象。

+5

您與迭代'對... in'一個數組,你不應該這樣做,但是這是沒有問題的。 'c'不是數組的元素,而是當前的屬性名稱(索引)。請參閱[MDN文檔](https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in) – 2012-01-30 14:30:00

+1

您應該查看[在jQuery中循環](http://api.jquery。 com/jQuery.each /) – ori 2012-01-30 14:34:09

回答

1

不使用for (c in messages)。

in用於迭代對象的屬性,而不是迭代數組中的值。

使用嘗試和真正的

for(var i = 0; i < messages.length; i++) { 
... 
} 

而且,你是不是把你的getTitlegetMessage上的原型,這是一種浪費的方法。

+0

謝謝!把這些方法放在原型上有什麼好處?語法(在對象塊之外)看起來像後來會讓我困惑(來自C系列背景,其中類方法在類代碼塊中聲明)。 – dotancohen 2012-01-30 14:58:53

+1

dotancohen這個問題在SO上非常受歡迎。見http://stackoverflow.com/questions/4650513/why-is-javascript-prototyping/4650576#4650576和也http://stackoverflow.com/questions/8874115/prototypal-inheritance-best-practices/8874140#8874140 – hvgotcodes 2012-01-30 15:02:24

+0

謝謝。我看到的不是我在羅馬,我最好習慣於像羅馬人那樣做(在其中一個鏈接上解釋一位評論者)。 – dotancohen 2012-01-30 15:18:58

0

在JS的for in循環的語法是:

for(var key in obj) 
    { 
     var currentElement = obj[key]; 
    }