Если 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));
Живая копия
ВВ первом случае (new Foo()
) новый объект, созданный Foo
, не имеет собственных свойств (только унаследованных), поэтому size
в итоге становится 0
, тогда как sizeInherited
равен 2
(потому что он наследуетдва свойства из его прототипа).
Во втором случае, поскольку f
имеет свои собственные PK-34
и PK-35
свойства, его size
равно 2
.Он не наследует никаких свойств от своего прототипа, поэтому sizeInherited
также равен 2
.
В третьем случае bar
имеет два наследуемых свойства и одно собственное свойство, поэтому 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")
Живая копия
Обратите внимание, что функции, которые мы добавили к Model_value
, назначены свойствам, и поэтому они отображаются в итогах.