If size
最终为零,显然有问题的对象是继承这些属性来自其原型。在这种情况下,这意味着您不希望hasOwnProperty
check.
Example:
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));
实时复制 http://jsbin.com/ulipi5/2
在第一种情况下(new Foo()
),创建的新对象Foo
没有自己的属性(只有继承的属性),所以size
最终成为0
然而sizeInherited
is 2
(因为它从其原型继承了两个属性)。
在第二种情况下,因为f
有它的own PK-34
and PK-35
属性,其size
is 2
。它没有从其原型继承任何属性,因此sizeInherited
也是2
.
在第三种情况下,bar
既有两个继承的属性,又有一个自己的属性,所以size
is 3
and sizeInherited
is 2
.
Update:编辑似乎稍微改变了问题。如果您尝试迭代属性in Model_value
,那么你不想接受参数,你想使用this
:
来找出有多少个own它具有的属性:
Model_value.size = function() {
var size = 0, key;
for (key in this) {
if (this.hasOwnProperty(key)) size++;
}
return size;
};
查找有多少个属性total它具有(包括继承的):
Model_value.size = function() {
var size = 0, key;
for (key in this) {
size++;
}
return size;
};
Example:
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")
实时复制 http://jsbin.com/ulipi5/3
请注意,我们添加的函数Model_value
已分配给属性,因此它们会显示在总计中。