Object.getOwnPropertyNames()

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

Спробуйте його в дії

Синтаксис

Object.getOwnPropertyNames(obj)

Параметри

obj

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

Повернене значення

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

Опис

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

У ES5, якщо аргумент цього метода не є об'єктом (є примітивом), то це призводить до TypeError. В ES2015, необ'єктний аргумент зводиться до об'єкта.

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

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

Приклади

Застосування Object.getOwnPropertyNames()

const arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort());
// ["0", "1", "2", "length"]

// Масивоподібний об'єкт
const obj = { 0: "a", 1: "b", 2: "c" };
console.log(Object.getOwnPropertyNames(obj).sort());
// ["0", "1", "2"]

Object.getOwnPropertyNames(obj).forEach((val, idx, array) => {
  console.log(`${val} -> ${obj[val]}`);
});
// 0 -> a
// 1 -> b
// 2 -> c

// неперелічувана властивість
const myObj = Object.create(
  {},
  {
    getFoo: {
      value() {
        return this.foo;
      },
      enumerable: false,
    },
  },
);
myObj.foo = 1;

console.log(Object.getOwnPropertyNames(myObj).sort()); // ["foo", "getFoo"]

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

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

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()), таким чином – надаючи вивід у вигляді виключно неперелічуваних ключів.

const target = myObject;
const enumAndNonEnum = Object.getOwnPropertyNames(target);
const enumOnly = new Set(Object.keys(target));
const nonenumOnly = enumAndNonEnum.filter((key) => !enumOnly.has(key));

console.log(nonenumOnly);

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

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
getOwnPropertyNames
Chrome Full support 5
Edge Full support 12
Firefox Full support 4
Internet Explorer Full support 9
Opera Full support 12
Safari Full support 5
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 12
Safari on iOS Full support 5
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0

Дивіться також