Javascript对象:在属性上迭代

Javascript对象:在属性上迭代,javascript,object,properties,iteration,Javascript,Object,Properties,Iteration,我有一个变量,当打印到控制台时,它如下所示: Object { PK-34={...}, PK-35={...}} 我正在向该变量添加一个size方法: Model_value.size = function(obj) { var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) size++; } return size; }; 此方法返回0,并使用以下方法迭代这些属性: f

我有一个变量,当打印到控制台时,它如下所示:

Object { PK-34={...}, PK-35={...}}
我正在向该变量添加一个size方法:

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属性?

如果
大小
最终为零,显然所讨论的对象是从其原型继承这些属性。在这种情况下,这意味着您不需要检查
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));
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")

在第一种情况下(
new Foo()
),由
Foo
创建的新对象没有自己的属性(只有继承的属性),因此
size
最终是
0
,而
sizeInherited
2
(因为它从原型继承了两个属性)

在第二种情况下,因为
f
有自己的
PK-34
PK-35
属性,所以它的
大小
2
。它不从原型继承任何属性,因此
sizeInherited
也是
2

在第三种情况下,
bar
既有两个继承属性,又有一个自己的属性,因此
size
3
sizeInherited
2


更新:编辑似乎稍微改变了问题。如果您试图迭代
模型值
中的属性,那么您不想接受参数,您需要使用

要查找它拥有多少自有属性,请执行以下操作:

Model_value.size = function() {
    var size = 0, key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};
要查找它总共有多少个属性(包括继承的属性),请执行以下操作:

例如:

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));
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\u value
的函数已分配给属性,因此它们将显示在总数中。

干杯!现在有道理了。再加上右手边令人印象深刻的“相关”链接——足以让我的头脑转向js。非常感谢您的及时回复@Val Redchenko:不用担心,很高兴这有帮助。@Tim对代码格式很抱歉。谢谢你的编辑。