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 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |