Перебор объектов javascript и методов valueOf toString - PullRequest
2 голосов
/ 22 сентября 2011
var x = {
    article: "bla bla bla ",
    journal: "le monde ",
    magazine: "playboy"
};

for (var i in x) { 
    alert(i + " "+ x[i]);
}

Каждый объект JS имеет метод valueOf и toString.Почему я не вижу их, когда перебираю свойства объекта x?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Они не перечисляемые свойства. Попробуйте Object.getOwnPropertyNames. Работает только в некоторых браузерах:

Это НЕ проверяет прото, поэтому вам нужно сделать что-то очень сложное:

var x, y, z, getAllKeys;
getAllKeys = function (obj,ar) {
    ar = ar || [new Array];
    ar[0] = ar[0].concat(Object.getOwnPropertyNames(obj));
    if (obj !== Function.prototype && Object.getPrototypeOf(obj)) {
        getAllKeys(Object.getPrototypeOf(obj),ar);
    }
    return ar[0];
}
console.log (getAllKeys(new Array));
for (x in y = getAllKeys(z = new Array)) {
    var key = y[x];
    var value = z[y[x]];
}

Обвините JavaScript в том, что он смешной и выглядит как сборка, может быть, jASM будет лучшим именем? (Шутка)

0 голосов
/ 22 сентября 2011

Движок специально скрывает эти методы от перечисления.

Цель этого состоит в том, чтобы позволить перебирать свойства объекта, не раздражаясь свойствами прототипа объекта.Таким образом, вы можете перебирать индексы Array, использовать Object в качестве хеш-таблиц и перебирать его свойства.

Однако это может быть легко нарушено.Например, если вы используете пользовательский метод в Object.property, он внезапно появится во время перечисления свойств всех объектов:

var obj = { foo: 0 };

Object.prototype.bar = 1;

// prints 'foo' and 'bar'
for (var k in obj) {
    console.log(k);
}

Это делает опасным расширение Object.prototype.

Вы можете проверить, происходит ли свойство от самого объекта или его прототипа, используя метод Object.hasOwnProperty:

// prints 'foo'
for (var k in obj) {
    if (!obj.hasOwnProperty(a)) continue;
    console.log(k);
}

В качестве альтернативы, вы можете использовать Object.defineProperty определите неперечислимые свойства, если вам не нужны старые браузеры:

Object.defineProperty(Object.prototype, 'bar', {value: 1, enumerable: false});

// prints 'foo'
for (var k in obj) {
    console.log(k);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...