Object.getOwnPropertyNames()

Метод Object.getOwnPropertyNames() повертає масив усіх властивостей (в тому числі неперелічуваних, за винятком властивостей, що використовують символ), знайдених безпосередньо на наданому об'єкті.

Синтаксис

Object.getOwnPropertyNames(obj)

Параметри

obj
Об'єкт, чиї перелічувані та неперелічувані властивості будуть повернені.

Значення, що повертається

Масив рядків, що відповідає властивостям, знайденим безпосередньо у наданому об'єкті.

Опис

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

Приклади

Використання Object.getOwnPropertyNames()

var arr = ['а', 'б', 'в'];
console.log(Object.getOwnPropertyNames(arr).sort()); 
// виведе ["0", "1", "2", "length"]

// подібний до масиву об'єкт
var obj = { 0: 'а', 1: 'б', 2: 'в' };
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 -> а
// 1 -> б
// 2 -> в

// неперелічувана властивість
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()).

Елементи, знайдені у ланцюжку прототипів, не додаються у список:

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

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

console.log(
  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. У ES2015 аргумент, що не є об'єктом, буде приведений до об'єкта.

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

Object.getOwnPropertyNames('foo');
// ["0", "1", "2", "length"]  (код ES2015)

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

Специфікація Статус Коментар
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.getOwnPropertyNames' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.getOwnPropertyNames' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.getOwnPropertyNames' in that specification.
Standard Початкове визначення. Реалізоване у JavaScript 1.8.5.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
getOwnPropertyNamesChrome Full support 5Edge Full support 12Firefox Full support 4IE Full support 9Opera Full support 12Safari Full support 5WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Примітки щодо Firefox

До Firefox 28 метод Object.getOwnPropertyNames не бачив невирішених властивостей об'єктів Error. Це було виправлено у пізніших версіях (bug 724768).

Див. також