Object.getOwnPropertyNames()
============================

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

Интерактивный пример
--------------------

Синтаксис
---------


```js
Object.getOwnPropertyNames(obj);
```

### Параметры

`obj`

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

### Возвращаемое значение

Массив строк, который соответствует свойствам, найденным непосредственно в данном объекте.

Описание
--------

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

Примеры
-------

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


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

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

// Печать имён и значений свойств с помощью Array.forEach
Object.getOwnPropertyNames(obj).forEach(function (val, idx, array) {
  console.log(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;

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


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

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


```js
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()`) и, таким образом, оставляющая только неперечисляемые ключи.


```js
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 такой аргумент будет приведён к объекту.


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

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

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-object.getownpropertynames |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* Перечисляемость и собственность свойств (en-US)
* `Object.prototype.hasOwnProperty()`
* `Object.prototype.propertyIsEnumerable()`
* `Object.create()`
* `Object.keys()`
* `Array.forEach()`