Сводка
Метод Object.getOwnPropertyNames()
возвращает массив со всеми свойствами (независимо от того, перечисляемые они или нет), найденными непосредственно в переданном объекте.
Синтаксис
Object.getOwnPropertyNames(obj)
Параметры
obj
- Объект, чьи перечисляемые и не перечисляемые собственные свойства будут возвращены.
Описание
Метод Object.getOwnPropertyNames
возвращает массив строк, соответствующих перечисляемым и не перечисляемым свойствам, найденным непосредственно в объекте obj
. Порядок перечисляемых свойств в массиве соответствует порядку при обходе объекта циклом for...in
(или порядку свойств, при возврате их методом Object.keys
). Порядок не перечисляемых свойств в массиве, а так же их местоположение среди перечислемых свойств, не определены.
Примеры
Пример: использование Object.getOwnPropertyNames()
var arr = ['a', 'b', 'c']; print(Object.getOwnPropertyNames(arr).sort()); // напечатает '0,1,2,length' // Массивоподобный объект var obj = { 0: 'a', 1: 'b', 2: 'c' }; print(Object.getOwnPropertyNames(obj).sort()); // напечатает '0,1,2' // Печать имён и значений свойств с помощью Array.forEach Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) { print(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; print(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() {}; alert( 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
. В ES6 такой аргумент будет приведён к объекту.
> Object.getOwnPropertyNames('foo') TypeError: "foo" is not an object // код ES5 > Object.getOwnPropertyNames('foo') ['length', '0', '1', '2'] // код ES6
Спецификации
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 5.1 (ECMA-262) Определение 'Object.getOwnPropertyNames' в этой спецификации. |
Стандарт | Изначальное определение. Реализована в JavaScript 1.8.5. |
ECMAScript 6 (ECMA-262) Определение 'Object.getOwnPropertyNames' в этой спецификации. |
Кандидат в рекомендации |
Совместимость с браузерами
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | 5 | 4.0 (2) | 9 | 12 | 5 |
Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | ? | ? | ? | ? | ? | ? |
На основе таблицы совместимости Kangax.
Примечание по SpiderMonkey
Вплоть до версии SpiderMonkey 28 (Firefox 28 / Thunderbird 28 / SeaMonkey 2.25 / Firefox OS 1.3), метод Object.getOwnPropertyNames
не видел неразрешённые свойства объекта Error
. Это было исправлено в следующих версиях (ошибка 724768).