2011-01-30 97 views
2

我有一個變量,該變量,印製到控制檯時,看起來像這樣:JavaScript對象:迭代性質

Object { PK-34={...}, PK-35={...}} 

我添加的尺寸的方法來這個變量:

Model_value.size = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
    if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

該方法返回0,並遍歷使用這些屬性:

for (foo in Model_value) 
{ 
    //... 
} 

不起作用。

我將如何重複這些PK-34,PK-35屬性?

+1

@Tim很抱歉代碼格式。感謝編輯。 – 2011-01-31 10:16:57

回答

7

如果size最終爲零,顯然有問題的對象是從它的原型繼承這些屬性。在這種情況下,這意味着你不想要hasOwnProperty檢查。

實施例:

var Model_value = {}; 
Model_value.size = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
    if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 
Model_value.sizeInherited = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
     size++; 
    } 
    return size; 
}; 

function Foo() { 
} 
Foo.prototype["PK-34"] = { 
    name: "I'm PK-34" 
}; 
Foo.prototype["PK-35"] = { 
    name: "I'm PK-35" 
}; 

display("Model_value.size(new Foo()) = " + Model_value.size(new Foo())); 
display("Model_value.sizeInherited(new Foo()) = " + Model_value.sizeInherited(new Foo())); 

var f = { 
    "PK-34": {name: "I'm PK-34"}, 
    "PK-35": {name: "I'm PK-35"} 
}; 

display("Model_value.size(f) = " + Model_value.size(f)); 
display("Model_value.sizeInherited(f) = " + Model_value.sizeInherited(f)); 

var bar = new Foo(); 
bar["PK-36"] = {name: "I'm PK-36"}; 

display("Model_value.size(bar) = " + Model_value.size(bar)); 
display("Model_value.sizeInherited(bar) = " + Model_value.sizeInherited(bar)); 

Live copy

在第一種情況(new Foo()),由Foo創建的新對象沒有其自己的(不僅繼承的)的特性,因此size最終被0sizeInherited2(因爲它從原型繼承了兩個屬性)。

在第二種情況下,因爲f有其自己的PK-34PK-35性能,其size2。它的原型沒有繼承任何屬性,所以sizeInherited也是2

在第三種情況下,bar兼具2個繼承屬性和它自己的一個屬性,所以size3sizeInherited2


更新:編輯似乎改變問題的位。如果你想在Model_value遍歷性,那麼你不想接受任何參數,你要使用this

爲了找到它有多少自己特性有:

Model_value.size = function() { 
    var size = 0, key; 
    for (key in this) { 
     if (this.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

爲了找到它有多少性能有(包括繼承的):

Model_value.size = function() { 
    var size = 0, key; 
    for (key in this) { 
     size++; 
    } 
    return size; 
}; 

例子:

function Model() { 
} 
Model.prototype["PK-34"] = { 
    name: "I'm PK-34" 
}; 
Model.prototype["PK-35"] = { 
    name: "I'm PK-35" 
}; 

var Model_value = new Model(); 

Model_value.size = function() { 
    var size = 0, key; 
    for (key in this) { 
     if (this.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

Model_value.sizeInherited = function() { 
    var size = 0, key; 
    for (key in this) { 
     size++; 
    } 
    return size; 
}; 

display("Model_value.size() = " + Model_value.size()); 
// ^-- returns 2 ("size" and "sizeInherited") 

display("Model_value.sizeInherited() = " + Model_value.sizeInherited()); 
// ^-- returns 4 ("PK-34", "PK-35", "size", and "sizeInherited") 

Live copy

請注意,我們已經添加到Model_value的功能分配給的屬性,所以他們在總計出現。

+0

乾杯!現在有道理。再加上右邊一系列令人印象深刻的「相關」鏈接 - 足以讓我的腦袋圍繞js。非常感謝您的及時響應! – 2011-01-31 10:15:49