2011-01-30 152 views
2

樣品javascript代碼:通過對象數組搜索,未定義對象的屬性?

function a() { 
    this.array1 = []; 
    this.addToArray = function(name) { 
     this.array1.push(new b(name)); 
     return true; 
    } 
    this.searchForName = function(name) { 
     for(var i in this.array1) { 
      alert(i.name); 
     } 
    } 
    function b(name) { 
     this.name = name; 
    } 
} 

我包含在HTML文件中這個JavaScript文件。 HTML文檔的內部腳本標記我有這樣的代碼:

var myObject = new a(); 
myObject.addToArray("test1"); 
myObject.searchForName("test1"); 

運行這段代碼,我希望在這"test1"警報彈出,而是它會彈出未定義。然而,Chrome中的調試器顯示myObject中有一個數組,其名稱爲"test1"。當我使用斷點來測試代碼時,它顯示在調用警報的那一刻,i.name未定義爲。這有什麼問題?

回答

2

您正在尋找i號碼的name房產,而不是的this.array會員。

所以:

i.name 

應該是:

this.array1[i].name 

結果是:

this.searchForName = function(name) { 
    for(var i in this.array1) { 
      // get it from this array1 
     alert(this.array1[i].name); 
    } 
} 

工作例如:http://jsfiddle.net/seNxD/

另外,如果您只對數字索引感興趣,那麼使用for-in語句並不是一個好主意。由於您沒有枚舉,所以使用for語句。

+0

當循環訪問數組元素時,不要使用`for ... in`。 – mhitza 2011-01-30 20:29:51

+0

@mhitza:這不是我的答案所說的嗎? ; o) – user113716 2011-01-30 20:30:53

2

千萬不要使用for...inMDC documentation describes why)在陣列上循環。使用正常的循環for

for(var i = this.array1.length;i--;) { 
    alert(this.array1[i].name); 
} 

for...in環路在密鑰對象的無論如何,這將是一個數組的索引。因此,for...in循環的循環體必須與上面所示的for循環完全相同。

例如,你可以使用for...in如果你有這樣的:

var obj = {foo: 'bar', answer: '42'}; 
for(var key in obj) { 
    alert(key + " is " + obj[key]); 
} 

此外應注意:這是慣例,開始的構造函數的名稱以大寫字母。