如果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
最終被0
而sizeInherited
是2
(因爲它從原型繼承了兩個屬性)。
在第二種情況下,因爲f
有其自己的PK-34
和PK-35
性能,其size
是2
。它的原型沒有繼承任何屬性,所以sizeInherited
也是2
。
在第三種情況下,bar
兼具2個繼承屬性和它自己的一個屬性,所以size
是3
和sizeInherited
是2
。
更新:編輯似乎改變問題的位。如果你想在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
的功能分配給的屬性,所以他們在總計出現。
@Tim很抱歉代碼格式。感謝編輯。 – 2011-01-31 10:16:57