Listar todas las propiedades de prototipo de un objeto Javascript

1 minuto de lectura

avatar de usuario
Oli Soproni B.

¿Hay alguna otra forma de buscar las propiedades prototipo de un objeto javascript? Digamos que tengo así.

function proton() {
    this.property1 = undefined;
    this.property2 = undefined;
};

proton.prototype = {

    sample1 : function() {
        return 'something';
    },

    sample2 : function() {
        return 'something';
    }

};

var my_object = new proton();

console.log(Object.keys(my_object));

devoluciones [“property1”, “property2”]

console.log(Object.getOwnPropertyNames(my_object));

devoluciones [“property1”, “property2”]

Pero lo que quiero imprimir son las propiedades del prototipo del objeto my_object.

[‘sample1’, ‘sample2’]

Para poder ver las propiedades del prototipo de ese objeto, necesito console.log (objeto) y, desde las herramientas de desarrollo, puedo buscar las propiedades de ese objeto.

Pero como estoy usando bibliotecas de terceros como phaser.js, react.js, create.js, no conozco la lista de propiedades del prototipo de un objeto creado a partir de estas bibliotecas.

¿Hay alguna función de prototipo de Object para enumerar todas las propiedades de prototipo de un objeto javascript?

avatar de usuario
Bergi

No es un método prototipo, pero puede usar Object.getPrototypeOf para atravesar la cadena de prototipos y luego obtener los propios nombres de propiedad de cada uno de esos objetos.

function logAllProperties(obj) {
     if (obj == null) return; // recursive approach
     console.log(Object.getOwnPropertyNames(obj));
     logAllProperties(Object.getPrototypeOf(obj));
}
logAllProperties(my_object);

Usando esto, también puede escribir una función que le devuelva una matriz de todos los nombres de propiedades:

accesorios de función (obj) { var p = [];  for (; obj != null; obj = Object.getPrototypeOf(obj)) { var op = Object.getOwnPropertyNames(obj);  for (var i=0; i

  • Not a JS guru here, is there any reason why accessing __proto__ and converting it to an array is a bad idea? ex: var arr = Object.keys(my_object.__proto__).map(function (key) {return my_object.__proto__[key]});

    – Bajo

    11 de mayo de 2015 a las 2:00

  • @BassemDy Para uno, .__proto__ es como Object.getPrototypeOf pero está en desuso y no funciona en algunos casos extremos. Además, es posible que acceder a un solo nivel de la cadena de prototipos no le proporcione todas las propiedades. Por cierto, OP parece estar interesado en los nombres de las propiedades, no en los valores, por lo que puede omitirlo .map(…)

    – Bergi

    11 de mayo de 2015 a las 2:02


function prototypeProperties(obj) {
  var result = [];
  for (var prop in obj) {
    if (!obj.hasOwnProperty(prop)) {
      result.push(prop);
    }
  }
  return result;
}

EDITAR: Esto tomará todas las propiedades que se definieron en cualquier antepasado. Si desea un control más granular de qué se define dónde, la sugerencia de Bergi es buena.

  • Tenga en cuenta que esto solo imprimirá enumerable propiedades, mientras que la respuesta aceptada imprimirá todos propiedades, enumerables o no.

    – Ohad Schneider

    29 de diciembre de 2016 a las 13:28

La solución rápida y sucia de una sola línea sería:

console.log(Object.getOwnPropertyNames(Object.getPrototypeOf({ prop1: 'val1' })))

Si quieres algo más preciso, ¡ve con la respuesta aceptada!

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad