Object.getOwnPropertyNames()

Сводка

Метод Object.getOwnPropertyNames() возвращает массив со всеми свойствами (независимо от того, перечисляемые они или нет), найденными непосредственно в переданном объекте.

Синтаксис

Object.getOwnPropertyNames(obj)

Параметры

obj
Объект, чьи перечисляемые и не перечисляемые собственные свойства будут возвращены.

Описание

Метод Object.getOwnPropertyNames возвращает массив строк, соответствующих перечисляемым и не перечисляемым свойствам, найденным непосредственно в объекте obj. Порядок перечисляемых свойств в массиве соответствует порядку при обходе объекта циклом for...in (или порядку свойств, при возврате их методом Object.keys). Порядок не перечисляемых свойств в массиве, а так же их местоположение среди перечислемых свойств, не определены.

Примеры

Пример: использование Object.getOwnPropertyNames()

var arr = ['a', 'b', 'c'];
print(Object.getOwnPropertyNames(arr).sort()); // напечатает '0,1,2,length'

// Массивоподобный объект
var obj = { 0: 'a', 1: 'b', 2: 'c' };
print(Object.getOwnPropertyNames(obj).sort()); // напечатает '0,1,2'

// Печать имён и значений свойств с помощью Array.forEach
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {
  print(val + ' -> ' + obj[val]);
});
// напечатает
// 0 -> a
// 1 -> b
// 2 -> c

// Не перечисляемое свойство
var my_obj = Object.create({}, {
  getFoo: {
    value: function() { return this.foo; },
    enumerable: false
  }
});
my_obj.foo = 1;

print(Object.getOwnPropertyNames(my_obj).sort()); // напечатает 'foo,getFoo'

Если вы хотите обработать только перечисляемые свойства, смотрите в сторону метода Object.keys() или используйте цикл for...in (хотя стоит отметить, что он пройдётся по перечисляемым свойствам, присутствующим не только непосредственно в самом объекте, но и унаследованным из цепочки прототипов объекта; последние можно отфильтровать с помощью метода hasOwnProperty()).

Элементы в цепочке прототипов не перечисляются:

function ParentClass() {}
ParentClass.prototype.inheritedMethod = function() {};

function ChildClass() {
  this.prop = 5;
  this.method = function() {};
}
ChildClass.prototype = new ParentClass;
ChildClass.prototype.prototypeMethod = function() {};

alert(
  Object.getOwnPropertyNames(
    new ChildClass() // ['prop', 'method']
  )
);

Пример: получение только не перечисляемых свойств

Здесь используется функция Array.prototype.filter() для удаления перечисляемых ключей (полученных через метод Object.keys()) из списка всех ключей (полученных через метод Object.getOwnPropertyNames()) и, таким образом, оставляющая только не перечисляемые ключи.

var target = myObject;
var enum_and_nonenum = Object.getOwnPropertyNames(target);
var enum_only = Object.keys(target);
var nonenum_only = enum_and_nonenum.filter(function(key) {
  var indexInEnum = enum_only.indexOf(key);
  if (indexInEnum == -1) {
    // если ключ не найден в массиве enum_only, значит ключ является не перечисляемым
    // и нужно вернуть true, чтобы он попал в результирующий массив
    return true;
  } else {
    return false;
  }
});

console.log(nonenum_only);

Примечания

В ES5, если аргумент метода не является объектом (является примитивным значением), будет выброшено исключение TypeError. В ES6 такой аргумент будет приведён к объекту.

> Object.getOwnPropertyNames('foo')
TypeError: "foo" is not an object // код ES5

> Object.getOwnPropertyNames('foo')
['length', '0', '1', '2']         // код ES6

Спецификации

Спецификация Статус Комментарии
ECMAScript 5.1 (ECMA-262)
Определение 'Object.getOwnPropertyNames' в этой спецификации.
Стандарт Изначальное определение. Реализована в JavaScript 1.8.5.
ECMAScript 6 (ECMA-262)
Определение 'Object.getOwnPropertyNames' в этой спецификации.
Кандидат в рекомендации  

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 5 4.0 (2) 9 12 5
Возможность Android Chrome для Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? ? ? ? ? ?

На основе таблицы совместимости Kangax.

Примечание по SpiderMonkey

Вплоть до версии SpiderMonkey 28 (Firefox 28 / Thunderbird 28 / SeaMonkey 2.25 / Firefox OS 1.3), метод Object.getOwnPropertyNames не видел неразрешённые свойства объекта Error. Это было исправлено в следующих версиях (ошибка 724768).

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: Mingun
 Обновлялась последний раз: Mingun,