Object.getOwnPropertyNames()
============================

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 with JavaScript enabled. Enable JavaScript to view data.

Ver también
-----------

* Enumerability and ownership of properties (en-US)
* `Object.prototype.hasOwnProperty`
* `Object.prototype.propertyIsEnumerable`
* `Object.create`
* `Object.keys`
* `Array.forEach()`