Wilfred Hughes
Wilfred Hughes

Reputation: 31171

How can I see all properties (including inherited) in nodejs?

When working with nodejs, I like to use console.log to see what data is available in an object.

However, this doesn't work with inherited properties:

var Person = function () {};
Person.prototype.name = "anonymous";
var p = new Person();

console.log(['p', p]); // [ 'p', {} ]
// This doesn't even give me a hint that it's inherited from Person!
console.log(['typeof p', typeof p]); // [ 'typeof p', 'object' ]
console.log(['p.name', p.name]); // "anonymous"

Given an object, how can view all the properties I can access?

Upvotes: 1

Views: 762

Answers (3)

chrisbajorin
chrisbajorin

Reputation: 6153

If your purpose is just for debugging, you can check the __proto__ object:

function Person() {};
Person.prototype.name = "abc";
Person.prototype.smallObj = {
    name: "abc"
};

Person.prototype.deepObj = {
    one: {
        two: {
            three: {
                four: "4"
            }
        }
    }
};

var p = new Person();

console.log(p);
// Person {}

console.log(p.__proto__);
/*
Person {
    name: 'abc',
    smallObj: { name: 'abc' },
    deepObj: { one: { two: [Object] } }
}
*/
var util = require("util");
console.log(util.inspect(p.__proto__, {depth: null}));
/*
Person {
    name: 'abc',
    smallObj: { name: 'abc' },
    deepObj: { one: { two: { three: { four: '4' } } } }
}
*/

On the last one, using util.inspect() with the depth option will allow you to look further into deeply nested objects.

Upvotes: 1

emilioriosvz
emilioriosvz

Reputation: 1639

Use Object.getOwnPropertyNames() to get all properties that belong to an object:

console.log(Object.getOwnPropertyNames(Person))
// [ 'length', 'name', 'arguments', 'caller', 'prototype' ]

console.log(Object.getOwnPropertyNames(Object))
// ['length','name','arguments','caller','prototype','keys','create',  'defineProperty','defineProperties','freeze','getPrototypeOf','setPrototypeOf','getOwnPropertyDescriptor','getOwnPropertyNames','is','isExtensible','isFrozen','isSealed','preventExtensions','seal','getOwnPropertySymbols','deliverChangeRecords','getNotifier','observe','unobserve','assign' ]

Also you can combine Object.getOwnPropertyNames() with walking up the prototype chain:

var getAllProperties = function (object) {

  var properties = []
  do {
    Object.getOwnPropertyNames(object).forEach((prop) => {
      if (!~properties.indexOf(prop)) {
        properties.push(prop)
      }
    })
  } while (object = Object.getPrototypeOf(object))

  return properties
}

Upvotes: 1

madox2
madox2

Reputation: 51881

You are assigning property to constructor function Person. It does not share properties with instances. You need to add property to Person's prototype:

Person.prototype.name = "anonymous";

To find out if your object inherited from Person you can do:

p instanceof Person; // true

You can print out all of an object's enumerable properties by performing the following:

for (var key in p) {
    console.log(key);
}

Upvotes: 1

Related Questions