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

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

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"]
  ),
);

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.

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) {
    //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

Ver también