--- title: Object.getOwnPropertyNames() slug: Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames tags: - ECMAScript5 - JavaScript - JavaScript 1.8.5 - Method - Object - Reference - Référence(2) translation_of: Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames ---
{{JSRef("Global_Objects", "Object")}}

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

{{EmbedInteractiveExample("pages/js/object-getownpropertynames.html")}}

Синтаксис

Object.getOwnPropertyNames(obj)

Параметры

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

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

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

Описание

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

Примеры

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

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'

Если вы хотите обработать только перечисляемые свойства, смотрите в сторону метода {{jsxref("Object.keys()")}} или используйте цикл {{jsxref("Statements/for...in", "for...in")}} (хотя стоит отметить, что он пройдётся по перечисляемым свойствам, присутствующим не только непосредственно в самом объекте, но и унаследованным из цепочки прототипов объекта; последние можно отфильтровать с помощью метода {{jsxref("Object.prototype.hasOwnProperty()", "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']
  )
);

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

Здесь используется функция {{jsxref("Array.prototype.filter()")}} для удаления перечисляемых ключей (полученных через метод {{jsxref("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, если аргумент метода не является объектом (является примитивным значением), будет выброшено исключение {{jsxref("Global_Objects/TypeError", "TypeError")}}. В ES6 такой аргумент будет приведён к объекту.

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

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

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

Спецификация Статус Комментарии
{{SpecName('ES5.1', '#sec-15.2.3.4', 'Object.getOwnPropertyNames')}} {{Spec2('ES5.1')}} Изначальное определение. Реализована в JavaScript 1.8.5.
{{SpecName('ES6', '#sec-object.getownpropertynames', 'Object.getOwnPropertyNames')}} {{Spec2('ES6')}}  

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

{{Compat("javascript.builtins.Object.getOwnPropertyNames")}}

 

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