Object.getOwnPropertyNames()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
ÐеÑод Object.getOwnPropertyNames() возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив Ñо вÑеми ÑвойÑÑвами (незавиÑимо Ð¾Ñ Ñого, пеÑеÑиÑлÑемÑе они или неÑ), найденнÑми непоÑÑедÑÑвенно в пеÑеданном обÑекÑе.
ÐнÑеÑакÑивнÑй пÑимеÑ
const object1 = {
a: 1,
b: 2,
c: 3,
};
console.log(Object.getOwnPropertyNames(object1));
// Expected output: Array ["a", "b", "c"]
СинÑакÑиÑ
Object.getOwnPropertyNames(obj);
ÐаÑамеÑÑÑ
obj-
ÐбÑекÑ, ÑÑи пеÑеÑиÑлÑемÑе и непеÑеÑиÑлÑемÑе ÑобÑÑвеннÑе ÑвойÑÑва бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑенÑ.
ÐозвÑаÑаемое знаÑение
ÐаÑÑив ÑÑÑок, коÑоÑÑй ÑооÑвеÑÑÑвÑÐµÑ ÑвойÑÑвам, найденнÑм непоÑÑедÑÑвенно в данном обÑекÑе.
ÐпиÑание
ÐеÑод Object.getOwnPropertyNames возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив ÑÑÑок, ÑооÑвеÑÑÑвÑÑÑиÑ
пеÑеÑиÑлÑемÑм и непеÑеÑиÑлÑемÑм ÑвойÑÑвам, найденнÑм непоÑÑедÑÑвенно в обÑекÑе obj. ÐоÑÑдок пеÑеÑиÑлÑемÑÑ
ÑвойÑÑв в маÑÑиве ÑооÑвеÑÑÑвÑÐµÑ Ð¿Ð¾ÑÑÐ´ÐºÑ Ð¿Ñи обÑ
оде обÑекÑа Ñиклом for...in (или пÑи возвÑаÑе меÑодом Object.keys). ÐоÑÑдок непеÑеÑиÑлÑемÑÑ
ÑвойÑÑв в маÑÑиве, а Ñакже иÑ
меÑÑоположение ÑÑеди пеÑеÑиÑлÑемÑÑ
ÑвойÑÑв не опÑеделенÑ.
ÐÑимеÑÑ
>ÐÑимеÑ: иÑполÑзование Object.getOwnPropertyNames()
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'
ÐÑли Ð²Ñ Ñ
оÑиÑе обÑабоÑаÑÑ ÑолÑко пеÑеÑиÑлÑемÑе ÑвойÑÑва, ÑмоÑÑиÑе в ÑÑоÑÐ¾Ð½Ñ Ð¼ÐµÑода 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
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.getownpropertynames> |