web-dev-qa-db-ja.com

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

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

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

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

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

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

83
thom
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.Push(m)
        }
    }
    return res;
}
65
Makram Saleh

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

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

オブジェクトの一部のプロパティは列挙できないため、オブジェクトにevery関数を見つけることができないため、これには問題があります。

46
Larry Osterman

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

27
pstenstrm

最新のブラウザでは、 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のみを取得するため、プロトタイプチェーンの他の場所で見つかったプロパティは返されないことに注意してください。しかし、それはあなたのリクエストではないようですので、このアプローチで十分だと思います。

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

14
Sampson

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

  console.log(yourJSObject);

またはそれ以上

  console.dir(yourJSObject.__proto__);
6
Matoeil

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"]
3
Kevin Beal
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.Push(name)
    }
}

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

2
Matt Greer

最良の方法は次のとおりです。

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

es6でのみ「let」を使用し、代わりに「var」を使用します

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

コンストラクタのプロトタイプを単純にループして、すべてのメソッドを抽出できます。

1
Raynos

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

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

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

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];
    });
};
0
sidanmor

Chromeはkeys(foo.prototype)です。 ["a", "b"]を返します。

参照: https://developer.chrome.com/devtools/docs/commandline-api#keysobjectenter image description here

後の編集:(大きなオブジェクトの場合)すばやくコピーする必要がある場合は、copy(keys(foo.prototype))を実行すると、クリップボードに保存されます。

0
Șerban Ghiță