Движок специально скрывает эти методы от перечисления.
Цель этого состоит в том, чтобы позволить перебирать свойства объекта, не раздражаясь свойствами прототипа объекта.Таким образом, вы можете перебирать индексы 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);
}