オブジェクトのメソッドを取得する方法は?


89

オブジェクトからすべてのメソッドを取得するメソッドまたはプロパティはありますか?例えば:

function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}

foo.get_methods(); // returns ['a', 'b'];

更新:Jqueryにそのようなメソッドはありますか?

ありがとうございました。


回答:


70
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}

2
for..in方法は、標準的なアプローチです。
Makram Saleh 2011

1
編集ありがとうございます、クリス!TypeErrorsはお好きだと思います…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert '19年

コードは角括弧で修正されました。ご不便おかけしてすみません。
Makram Saleh

便宜上、配列のソートを追加しました。
SomeGuyOnAComputer 2015

状態を評価すると違いはありますm instanceof Functionか?
ホセ

46

技術的にはJavaScriptオブジェクトにはメソッドがないことに注意してください。それらにはプロパティがあり、その一部は関数オブジェクトである場合があります。つまり、プロパティを列挙するのと同じように、オブジェクトのメソッドを列挙することができます。これ(またはこれに近いもの)はうまくいくはずです:

var bar
for (bar in foo)
{
    console.log("Foo has property " + bar);
}

オブジェクトの一部のプロパティは列挙できないため、オブジェクトのすべての関数を見つけることができないため、これには複雑さが伴います。


2
多分彼はconsole.logについて話していました。ありがとうございました。
トム

2
ええ、私は毎日JSをしているわけではないので、100%アップしていません。しかし、私は、言語を理解して...
ReinstateMonicaラリー・オスターマン

27

を使用console.dir(object)して、そのオブジェクトのプロパティをコンソールに書き込むことができます。


17

最近のブラウザーObject.getOwnPropertyNamesでは、オブジェクトのすべてのプロパティ(列挙可能と列挙不可の両方)を取得するために使用できます。例えば:

function Person ( age, name ) {
    this.age = age;
    this.name = name;
}

Person.prototype.greet = function () {
    return "My name is " + this.name;
};

Person.prototype.age = function () {
    this.age = this.age + 1;
};

// ["constructor", "greet", "age"]
Object.getOwnPropertyNames( Person.prototype );

これはown-propertiesのみを取得するため、プロトタイプチェーンの他の場所にあるプロパティは返されないことに注意してください。しかし、それはあなたの要求ではないようですので、このアプローチで十分だと思います。

列挙可能なプロパティのみを表示したい場合は、代わりにを使用できますObject.keys。これは同じコレクションから、列挙不可能なconstructorプロパティを除いたものを返します。


6

メソッドは、ブラウザの開発者ツール(F12)を使用して、オブジェクトのプロトタイプチェーンで検査できます。

  console.log(yourJSObject);

以上

  console.dir(yourJSObject.__proto__);

4

ES6の場合:

let myObj   = {myFn : function() {}, tamato: true};
let allKeys = Object.keys(myObj);
let fnKeys  = allKeys.filter(key => typeof myObj[key] == 'function');
console.log(fnKeys);
// output: ["myFn"]

4

私にとって、最終的な拡張クラスのメソッドを取得する唯一の信頼できる方法は、次のようにすることでした:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}

2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

私はセミコロンのない電話を使っています:)しかし、それは一般的な考えです。


4
セミコロンが付いていないが質問に答えられる電話はどれですか。LOL
ホーガン

私は新しい携帯電話があると思いコロンあなたの名前!
Redwolfプログラム

1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

コンストラクタのプロトタイプをループして、すべてのメソッドを抽出するだけです。


これは、オブジェクトに直接アタッチされたメソッドを考慮に入れません
Matt Greer

@MattGreer彼の例はコンストラクタのメソッドを呼び出しました。彼がコンストラクタからのメソッドとオブジェクトのどちらを望んでいるかは別の問題です。
レイノス2011

1

最善の方法は:

let methods = Object.getOwnPropertyNames(yourobject);
console.log(methods)

es6でのみ 'let'を使用し、代わりに 'var'を使用


1
属性のリストを返します。
Ali Ben Messaoud

Aliが言及したように、これはクラス(メソッド)でゲッター/セッターとして定義された関数を除外します。
Shaun


0

メソッド名を取得します。

var getMethodNames = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    }));
};

または、メソッドを取得します。

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.