Bir nesnenin yöntemlerine nasıl ulaşılır?


Yanıtlar:


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

2
for..inYolu standart bir yaklaşımdır.
Makram Saleh

1
Düzenlemen için teşekkürler, Chris! Sanırım TypeErrors'ı seviyorsun…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert

Kod artık köşeli parantezlerle sabitlenmiştir. Rahatsızlıktan dolayı özür dileriz.
Makram Saleh

Kolaylık sağlamak için diziyi sıralama eklendi.
SomeGuyOnAComputer

durumu değerlendirirseniz bir fark var m instanceof Functionmı?
Jose

46

Teknik olarak javascript nesnelerinin metotları olmadığını unutmayın. Bazıları işlev nesneleri olabilen özelliklere sahiptirler. Bu, özellikleri numaralandırabildiğiniz gibi bir nesnedeki yöntemleri de numaralandırabileceğiniz anlamına gelir. Bu (veya buna yakın bir şey) çalışmalıdır:

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

Bunun zorlukları vardır çünkü nesnelerin bazı özellikleri numaralandırılamaz, bu nedenle nesnedeki her işlevi bulamazsınız .


2
belki console.log'dan bahsediyordu. Teşekkür ederim.
thom

2
Evet, her gün JS yapmıyorum, bu yüzden% 100 çalışmıyorum. Ama dili anlıyorum ..
ReinstateMonica Larry Osterman

27

Bu console.dir(object)nesnelerin özelliklerini konsola yazmak için kullanabilirsiniz .


19

Modern tarayıcılarda Object.getOwnPropertyNames, bir nesne üzerindeki tüm özellikleri (hem numaralandırılabilir hem de numaralandırılamaz) almak için kullanabilirsiniz. Örneğin:

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

Bunun yalnızca kendi mülklerini aldığını unutmayın , dolayısıyla prototip zincirinde başka yerlerde bulunan özellikleri döndürmeyeceğini unutmayın. Ancak, bu sizin talebiniz gibi görünmüyor, bu nedenle bu yaklaşımın yeterli olduğunu varsayacağım.

Yalnızca numaralandırılabilir özellikleri görmek istiyorsanız, bunun yerine kullanabilirsiniz Object.keys. Bu, numaralandırılamayan constructorözelliği çıkararak aynı koleksiyonu döndürür .


6

Yöntemler, tarayıcının geliştirici araçları (F12) kullanılarak nesnenin prototip zincirinde incelenebilir:

  console.log(yourJSObject);

veya daha fazlası doğrudan

  console.dir(yourJSObject.__proto__);

4

ES6'da:

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

benim için, son sınıf genişletme sınıfının yöntemlerini elde etmenin tek güvenilir yolu şu şekilde yapmaktı:

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

Noktalı virgül içermeyen bir telefondayım :) ama genel fikir bu.


4
Hangi telefonda noktalı virgül yoktur, ancak soruları yanıtlamanıza izin verir? LOL
Hogan

Sanırım yeni bir telefon isminin iki nokta üst üste !
Redwolf Programları

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

Bir yapıcının prototipi üzerinde döngü oluşturabilir ve tüm yöntemleri ayıklayabilirsiniz.


Bu, doğrudan nesneye eklenen yöntemleri hesaba katmaz
Matt Greer

@MattGreer onun örneği bir yapıcı üzerinde bir yöntem çağırdı. Bir kurucudan veya bir nesneden yöntem isteyip istemediği farklı bir konudur.
Raynos

1

en iyi yol şudur:

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

sadece es6'da 'let'i kullanın, onun yerine' var 'kullanın


1
Özniteliklerin bir listesini döndürür.
Ali Ben Messaoud

Ali'nin belirttiği gibi, bu, bir sınıf (yöntemler) üzerinde alıcılar / ayarlayıcılar olarak tanımlanan işlevleri hariç tutar.
Shaun


0

Yöntem Adlarını Alın:

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

Veya Yöntemleri Alın:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.