Bagaimana cara mendapatkan metode objek?

90

Apakah ada metode atau properti untuk mendapatkan semua metode dari suatu objek? Sebagai contoh:

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

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

UPDATE: Apakah ada metode seperti itu di Jquery?

Terima kasih.

thom
sumber

Jawaban:

71
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
Makram Saleh
sumber
2
The for..incara adalah pendekatan standar.
Makram Saleh
1
Terima kasih atas suntingan Anda, Chris! Saya rasa Anda suka TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert
Kode sekarang diperbaiki dengan tanda kurung siku. Maaf untuk ketidaknyamanannya.
Makram Saleh
Menambahkan pengurutan array untuk kenyamanan.
SomeGuyOnAComputer
Apakah ada perbedaan jika Anda mengevaluasi kondisinya m instanceof Function?
Jose
46

Ingatlah bahwa objek javascript secara teknis tidak memiliki metode. Mereka memiliki properti, beberapa di antaranya mungkin berupa objek fungsi. Itu berarti Anda dapat menghitung metode dalam sebuah objek seperti Anda dapat menghitung properti. Ini (atau sesuatu yang dekat dengan ini) harus berfungsi:

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

Ada komplikasi untuk ini karena beberapa properti objek tidak dapat dihitung sehingga Anda tidak akan dapat menemukan setiap fungsi pada objek.

Kembalikan Monica Larry Osterman
sumber
2
mungkin dia sedang berbicara tentang console.log. Terima kasih.
thom
2
Ya, saya tidak melakukan JS setiap hari jadi saya tidak 100% melakukannya. Tapi saya mengerti bahasanya ..
ReinstateMonica Larry Osterman
27

Anda dapat menggunakan console.dir(object)untuk menulis properti objek ke konsol.

pstenstrm.dll
sumber
18

Di browser modern, Anda dapat menggunakan Object.getOwnPropertyNamesuntuk mendapatkan semua properti (baik yang dapat dihitung maupun yang tidak dapat dihitung) pada suatu objek. Contohnya:

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 );

Perhatikan bahwa ini hanya mengambil properti sendiri , jadi tidak akan mengembalikan properti yang ditemukan di tempat lain di rantai prototipe. Namun, itu sepertinya bukan permintaan Anda, jadi saya akan menganggap pendekatan ini sudah cukup.

Jika Anda hanya ingin melihat enumerable properti yang dapat , Anda dapat menggunakan Object.keys. Ini akan mengembalikan koleksi yang sama, dikurangi properti non-enumerable constructor.

Sampson
sumber
6

Metode dapat diperiksa dalam rantai prototipe objek menggunakan alat pengembang browser (F12):

  console.log(yourJSObject);

atau lebih langsung

  console.dir(yourJSObject.__proto__);
Matoeil
sumber
4

Di 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"]
Kevin Beal
sumber
4

bagi saya, satu-satunya cara yang dapat diandalkan untuk mendapatkan metode kelas perluasan terakhir, adalah dengan melakukan seperti ini:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
DevTheJo
sumber
2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

Saya menggunakan telepon tanpa titik koma :) tetapi itu adalah ide umumnya.

Matt Greer
sumber
4
Ponsel mana yang tidak memiliki titik koma, tetapi memungkinkan Anda menjawab pertanyaan? LOL
Hogan
Saya pikir telepon baru adalah titik dua nama Anda!
Program Redwolf
1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Anda cukup mengulang prototipe konstruktor dan mengekstrak semua metode.

Raynos
sumber
Ini tidak akan menjelaskan metode yang langsung dilampirkan ke objek
Matt Greer
@MattGreer contohnya memanggil metode pada konstruktor. Apakah dia menginginkan metode dari konstruktor atau objek adalah masalah yang berbeda.
Raynos
1

cara terbaik adalah:

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

gunakan 'let' hanya di es6, gunakan 'var' sebagai gantinya

Arturo Morales Rangel
sumber
1
Ini mengembalikan daftar atribut.
Ali Ben Messaoud
Seperti yang disinggung Ali, ini mengecualikan fungsi yang didefinisikan sebagai pengambil / penyetel pada kelas (metode).
Shaun
0

Dapatkan Nama Metode:

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

Atau, Dapatkan Metode:

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