Объект Javascript: перебор свойств - PullRequest
2 голосов
/ 31 января 2011

У меня есть переменная, которая при выводе на консоль выглядит следующим образом:

Object { PK-34={...}, PK-35={...}}

Я добавляю метод размера к этой переменной:

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?

1 Ответ

7 голосов
/ 31 января 2011

Если 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 имеет два наследуемых свойства и одно собственное свойство, поэтому size3 и 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, назначены свойствам, и поэтому они отображаются в итогах.

...