Bagaimana cara mendapatkan metode objek?


Jawaban:


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

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.


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.


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.


6

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

  console.log(yourJSObject);

atau lebih langsung

  console.dir(yourJSObject.__proto__);

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"]

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
}

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.


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.


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


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];
    });
};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.