Javascript对象:迭代属性

Val*_*nko 2 javascript iteration properties object

我有一个变量,当打印到控制台时,它看起来像这样:

Object { PK-34={...}, PK-35={...}}
Run Code Online (Sandbox Code Playgroud)

我正在为这个变量添加一个size方法:

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

此方法返回0,并使用以下方法迭代这些属性:

for (foo in Model_value)
{
  //...
}
Run Code Online (Sandbox Code Playgroud)

不起作用.

我如何迭代那些PK-34,PK-35属性?

T.J*_*der 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));
Run Code Online (Sandbox Code Playgroud)

实时复制

在第一种情况(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;
};
Run Code Online (Sandbox Code Playgroud)

要了解有多少属性有(包括继承的):

Model_value.size = function() {
    var size = 0, key;
    for (key in this) {
        size++;
    }
    return size;
};
Run Code Online (Sandbox Code Playgroud)

例:

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")
Run Code Online (Sandbox Code Playgroud)

实时复制

请注意,我们添加到的功能Model_value会分配给属性,因此它们会显示在总计中.