Перечислите все свойства прототипа объекта Javascript

Есть ли другой способ поиска свойств прототипа объекта javascript. Скажем, у меня так.

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));

возвращает ["property1", "property2"]

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

возвращает ["property1", "property2"]

Но я хочу напечатать свойства прототипа объекта my_object.

['sample1', 'sample2']

Чтобы увидеть свойства прототипа этого объекта, мне нужно console.log(объект) и из инструментов разработчика, я могу найти свойства этого объекта.

Но так как я использую сторонние библиотеки, такие как phaser.js, Reaction.js, create.js, я не знаю список свойств прототипа созданного объекта из этих библиотек.

Есть ли какая-либо функция-прототип Object, чтобы перечислить все свойства prototpye объекта javascript?

4 ответа

Решение

Не метод-прототип, но вы можете использовать Object.getPrototypeOf пройти цепочку прототипов и затем получить собственные имена свойств каждого из этих объектов.

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

Используя это, вы также можете написать функцию, которая возвращает вам массив всех имен свойств:

function props(obj) {
    var p = [];
    for (; obj != null; obj = Object.getPrototypeOf(obj)) {
        var op = Object.getOwnPropertyNames(obj);
        for (var i=0; i<op.length; i++)
            if (p.indexOf(op[i]) == -1)
                 p.push(op[i]);
    }
    return p;
}
console.log(props(my_object)); // ["property1", "property2", "sample1", "sample2", "constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable"
function prototypeProperties(obj) {
  var result = [];
  for (var prop in obj) {
    if (!obj.hasOwnProperty(prop)) {
      result.push(prop);
    }
  }
  return result;
}

РЕДАКТИРОВАТЬ: Это будет захватывать все свойства, которые были определены для любого предка. Если вы хотите более детальный контроль над тем, что и где определено, предложение Берги хорошо.

Быстрым и грязным однострочным решением будет:

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

Если вы хотите что-то более точное, используйте принятый ответ!

Если вы хотите перечислить все свойства прототипа объекта.

      let obj = {prop1:"", method(){}}
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(obj)))
// (12) ['constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty', '__lookupGetter__', '__lookupSetter__', 'isPrototypeOf', 'propertyIsEnumerable', 'toString', 'valueOf', '__proto__', 'toLocaleString']

и если вам нужны все свойства, включая собственные свойства объекта.

      [ ...Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ), ...Object.getOwnPropertyNames(obj) ]

// (14) ['constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty', '__lookupGetter__', '__lookupSetter__', 'isPrototypeOf', 'propertyIsEnumerable', 'toString', 'valueOf', '__proto__', 'toLocaleString', 'prop1', 'method']

только собственные свойства объекта.

      Object.getOwnPropertyNames(obj)
// (2) ['prop1', 'method']
Другие вопросы по тегам