tags:

views:

1301

answers:

5

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

+3  A: 

Here's a post on JS reflection. It should do what you're looking for.

Oli
+1  A: 

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.

MikeCroucher
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
+2  A: 

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
A: 

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
+4  A: 

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
the try/catch is a good approach. There are some property/methods in IE that will error out on access.
scunliffe
Yeah, I think there are some in Firefox as well.
troelskn