2012-01-30 111 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]; 
    }