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 July 2015.
Resumen
El método Object.getOwnPropertyNames()
devuelve un array con todas las propiedades (numerables o no) encontradas en un objeto dado.
Sintaxis
Object.getOwnPropertyNames(obj)
Parámetros
- obj
-
El objeto cuyas propiedades directas, numerables y no-numerables, serán devueltas.
Descripción
Object.getOwnPropertyNames
devuelve un array cuyos elementos son strings correspondientes a cada una de las propiedades encontradas directamente en obj
. El orden de las propiedades numerables en el array coincide con el expuesto para for...in loop (o para Object.keys
) con respecto a las propiedades del object. El orden de las propiedades no-numerables del array, y de éstas respecto a las numerables, no está definido.
Ejemplos
var arr = ["a", "b", "c"];
print(Object.getOwnPropertyNames(arr).sort()); // imprime "0,1,2,length"
// Objeto similar a Array
var obj = { 0: "a", 1: "b", 2: "c" };
print(Object.getOwnPropertyNames(obj).sort()); // imprime "0,1,2"
// Imprime nombres de variables y valores usando Array.forEach
Object.getOwnPropertyNames(obj).forEach(function (val, idx, array) {
print(val + " -> " + obj[val]);
});
// imprime
// 0 -> a
// 1 -> b
// 2 -> c
// propiedad no-numerable
var my_obj = Object.create(
{},
{
getFoo: {
value: function () {
return this.foo;
},
enumerable: false,
},
},
);
my_obj.foo = 1;
print(Object.getOwnPropertyNames(my_obj).sort()); // imprime "foo, getFoo"
Si se quiere solo las propiedades numerables, ver Object.keys
o usar un for...in loop (aunque esto devolvería propiedades numerables no directas del objeto pertenecientes a la cadena de prototype a la que pertenezca, a menos que finalmente se filtre con hasOwnProperty()).
Items de la cadena prototype no se listan:
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"]
),
);
Get Non-Enumerable Only
Aquí se usa la función Array.prototype.filter para quitar las keys numerables (obtenidas con Object.keys) de una lista con todas las keys (obtenida con Object.getOwnPropertynames) dejando solo las no-numerables.
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) {
//no encontrada en las keys de enum_only, por lo que se trata de una key numerable, se devuelve true para mantenerla en filter
return true;
} else {
return false;
}
});
console.log(nonenum_only);
Especificaciones
Specification |
---|
ECMAScript Language Specification # sec-object.getownpropertynames |
Compatibilidad con navegadores
BCD tables only load in the browser