1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
---
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
---
<div>{{JSRef("Global_Objects", "Object")}}</div>
<p>Метод <strong><code>Object.getOwnPropertyNames()</code></strong> возвращает массив со всеми свойствами (независимо от того, перечисляемые они или нет), найденными непосредственно в переданном объекте.</p>
<p>{{EmbedInteractiveExample("pages/js/object-getownpropertynames.html")}}</p>
<h2 id="Syntax">Синтаксис</h2>
<pre class="brush: js"><code>Object.getOwnPropertyNames(<var>obj</var>)</code></pre>
<h3 id="Parameters">Параметры</h3>
<dl>
<dt><code>obj</code></dt>
<dd>Объект, чьи перечисляемые <em>и неперечисляемые</em> собственные свойства будут возвращены.</dd>
</dl>
<h3 id="Возвращаемое_значение">Возвращаемое значение</h3>
<p>Массив строк, который соответствует свойствам, найденным непосредственно в данном объекте.</p>
<h2 id="Description">Описание</h2>
<p>Метод <code>Object.getOwnPropertyNames</code> возвращает массив строк, соответствующих перечисляемым <em>и неперечисляемым</em> свойствам, найденным непосредственно в объекте <code>obj</code>. Порядок перечисляемых свойств в массиве соответствует порядку при обходе объекта циклом {{jsxref("Statements/for...in", "for...in")}} (или при возврате методом {{jsxref("Object.keys")}}). Порядок неперечисляемых свойств в массиве, а также их местоположение среди перечисляемых свойств не определены.</p>
<h2 id="Examples">Примеры</h2>
<h3 id="Example:_Using_Object.getOwnPropertyNames">Пример: использование <code>Object.getOwnPropertyNames()</code></h3>
<pre class="brush: js">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'
</pre>
<p>Если вы хотите обработать только перечисляемые свойства, смотрите в сторону метода {{jsxref("Object.keys()")}} или используйте цикл {{jsxref("Statements/for...in", "for...in")}} (хотя стоит отметить, что он пройдётся по перечисляемым свойствам, присутствующим не только непосредственно в самом объекте, но и унаследованным из цепочки прототипов объекта; последние можно отфильтровать с помощью метода {{jsxref("Object.prototype.hasOwnProperty()", "hasOwnProperty()")}}).</p>
<p>Элементы в цепочке прототипов не перечисляются:</p>
<pre class="brush: js">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']
)
);
</pre>
<h3 id="Example:_Get_Non-Enumerable_Only">Пример: получение только не перечисляемых свойств</h3>
<p>Здесь используется функция {{jsxref("Array.prototype.filter()")}} для удаления перечисляемых ключей (полученных через метод {{jsxref("Object.keys()")}}) из списка всех ключей (полученных через метод <code>Object.getOwnPropertyNames()</code>) и, таким образом, оставляющая только неперечисляемые ключи.</p>
<pre class="brush: js">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);
</pre>
<h2 id="Notes">Примечания</h2>
<p>В ES5, если аргумент метода не является объектом (является примитивным значением), будет выброшено исключение {{jsxref("Global_Objects/TypeError", "TypeError")}}. В ES6 такой аргумент будет приведён к объекту.</p>
<pre class="brush: js">> Object.getOwnPropertyNames('foo')
TypeError: "foo" is not an object // код ES5
> Object.getOwnPropertyNames('foo')
['length', '0', '1', '2'] // код ES6
</pre>
<h2 id="Specifications">Спецификации</h2>
{{Specifications}}
<h2 id="Browser_compatibility">Совместимость с браузерами</h2>
<div>{{Compat("javascript.builtins.Object.getOwnPropertyNames")}}</div>
<p> </p>
<h2 id="See_also">Смотрите также</h2>
<ul>
<li><a href="/ru/docs/Enumerability_and_ownership_of_properties">Перечисляемость и собственность свойств</a></li>
<li>{{jsxref("Object.prototype.hasOwnProperty()")}}</li>
<li>{{jsxref("Object.prototype.propertyIsEnumerable()")}}</li>
<li>{{jsxref("Object.create()")}}</li>
<li>{{jsxref("Object.keys()")}}</li>
<li>{{jsxref("Array.forEach()")}}</li>
</ul>
|