80

Is there a way to print all methods of an object in JavaScript?

double-beep
  • 5,031
  • 17
  • 33
  • 41
Fabien
  • 6,700
  • 7
  • 35
  • 35

6 Answers6

102

Sure:

function getMethods(obj) {
  var result = [];
  for (var id in obj) {
    try {
      if (typeof(obj[id]) == "function") {
        result.push(id + ": " + obj[id].toString());
      }
    } catch (err) {
      result.push(id + ": inaccessible");
    }
  }
  return result;
}

Using it:

alert(getMethods(document).join("\n"));
troelskn
  • 115,121
  • 27
  • 131
  • 155
24

If you just want to look what is inside an object, you can print all object's keys. Some of them can be variables, some - methods.

The method is not very accurate, however it's really quick:

console.log(Object.keys(obj));
mrded
  • 4,674
  • 2
  • 34
  • 36
6

Here is an ES6 sample.

// Get the Object's methods names:
function getMethodsNames(obj = this) {
    return Object.keys(obj)
        .filter((key) => typeof obj[key] === 'function');
}

// Get the Object's methods (functions):
function getMethods(obj = this) {
    return Object.keys(obj)
        .filter((key) => typeof obj[key] === 'function')
        .map((key) => obj[key]);
}

obj = this is an ES6 default parameter, you can pass in an Object or it will default to this.

Object.keys returns an Array of the Object's own enumerable properties. Over the window Object it will return [..., 'localStorage', ...'location'].

(param) => ... is an ES6 arrow function, it's a shorthand for

function(param) {
    return ...
}

with an implicit return.

Array.filter creates a new array with all elements that pass the test (typeof obj[key] === 'function').

Array.map creates a new array with the results of calling a provided function on every element in this array (return obj[key]).

Novaterata
  • 4,356
  • 3
  • 29
  • 51
3

Take a gander at this code:-

function writeLn(s)
{
    //your code to write a line to stdout
    WScript.Echo(s)
}

function Base() {}
Base.prototype.methodA = function() {}
Base.prototype.attribA = "hello"

var derived = new Base()
derived.methodB = function() {}
derived.attribB = "world";

function getMethods(obj)
{
    var retVal = {}

    for (var candidate in obj)
    {
        if (typeof(obj[candidate]) == "function")
            retVal[candidate] = {func: obj[candidate], inherited: !obj.hasOwnProperty(candidate)}
    }
    return retVal
}

var result = getMethods(derived)
for (var name in result)
{
    writeLn(name + " is " + (result[name].inherited ? "" : "not") + " inherited")
}

The getMethod function returns the set of methods along with whether the method is one that has been inherited from a prototype.

Note that if you intend to use this on objects that are supplied from the context such as browser/DOM object then it won't work IE.

AnthonyWJones
  • 187,081
  • 35
  • 232
  • 306
1

From here:

Example 1: This example writes out all the properties of the "navigator" object, plus their values:

for (var myprop in navigator){
 document.write(myprop+": "+navigator[myprop]+"<br>")
}

Just replace 'navigator' with whatever object you are interested in and you should be good to go.

As mentioned by Anthony in the comments section - This returns all attributes not just methods as the question asked for.

Oops! That'll teach me to try and answer a question in a language I don't know. Still, I think the code is useful - just not what was required.

WalkingRandomly
  • 4,537
  • 5
  • 34
  • 34
  • This returns all attributes not just methods as the question asked for. On IE it only returns some of the properties and none of the methods. – AnthonyWJones Sep 30 '08 at 10:50
0

Since methods in JavaScript are just properties that are functions, the for..in loop will enumerate them with an exception - it won't enumerate built-in methods. As far as I know, there is no way to enumerate built-in methods. And you can't declare your own methods or properties on an object that aren't enumerable this way.

Neall
  • 26,428
  • 5
  • 49
  • 48