Bir nesnenin tüm yöntemleri nasıl görüntülenir?

Örneğin bir nesne için mevcut tüm yöntemleri nasıl listeleyeceğimi bilmek istiyorum:

 alert(show_all_methods(Math));

Bu yazdırılmalıdır:

abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
Çözüm

Sayılabilir olsun ya da olmasın, bir nesneye ait tüm özellikleri almak için Object.getOwnPropertyNames() kullanabilirsiniz. Örneğin:

console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]

Daha sonra sadece yöntemleri elde etmek için filter() kullanabilirsiniz:

console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
    return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]

ES3 tarayıcılarında (IE 8 ve daha düşük), yerleşik nesnelerin özellikleri numaralandırılamaz. Windowvedocument` gibi nesneler yerleşik değildir, tarayıcı tarafından tanımlanırlar ve büyük olasılıkla tasarım gereği numaralandırılabilirler.

ECMA-262 Sürüm 3]1'den:

Global Nesne Benzersiz bir küresel nesnesinden (15.1) önce oluşturulan kontrol herhangi bir yürütme bağlamına girer. Başlangıçta global nesne aşağıdaki özellikler:

  • Yerleşik Matematik, String, Tarih gibi nesneler, parseInt, vb. Bunların nitelikleri vardır { DontEnum }.
  • Ek ana bilgisayar tanımlandı özellikleri. Bu, aşağıdakileri içerebilir değeri küresel olan > özelliği nesnesinin kendisi; örneğin HTML belge nesnesi pencere modeli özelliği global nesnenin global nesnenin kendisi.

Kontrol olarak yürütme bağlamlarına girer ve ECMAScript kodu yürütülür, ek özellikler eklenebilir global nesne ve başlangıç özellikleri değiştirilebilir.

Bunun, bu nesnelerin Global nesnesinin numaralandırılabilir özellikleri olmadığı anlamına geldiğini belirtmeliyim. Spesifikasyon belgesinin geri kalanına bakarsanız, bu nesnelerin yerleşik özelliklerinin ve yöntemlerinin çoğunun üzerinde { DontEnum } niteliğinin ayarlandığını göreceksiniz.


Güncelleme: SO kullanıcısı CMS, { DontEnum }]2 ile ilgili bir [IE hatasını] dikkatime sundu.

JScript, DontEnum özniteliğini denetlemek yerine, nesne'nin prototip zincirinde DontEnum özniteliğine sahip aynı adlı bir özelliğin bulunduğu herhangi bir nesnedeki herhangi bir özelliğin üzerinden atlar.

Kısacası, nesne özelliklerinizi adlandırırken dikkatli olun. Eğer aynı isimde yerleşik bir prototip özellik ya da yöntem varsa, IE for...in döngüsünü kullanırken bunu atlayacaktır.

Yorumlar (11)
var methods = [];
for (var m in obj) {
    if (typeof obj[m] == "function") {
        methods.push(m);
    }
}
alert(methods.join(","));

Bu şekilde, obj üzerinde çağırabileceğiniz tüm yöntemleri elde edersiniz. Bu, prototipinden "miras" aldığı yöntemleri de içerir (javadakigetMethods()gibi). Eğer sadeceobjtarafından doğrudan tanımlanan yöntemleri görmek istiyorsanızhasOwnProperty` ile kontrol edebilirsiniz:

var methods = [];
for (var m in obj) {        
    if (typeof obj[m] == "function" && obj.hasOwnProperty(m)) {
        methods.push(m);
    }
}
alert(methods.join(","));
Yorumlar (8)

Kısa cevap, yapamazsınız çünkü Math ve Date (aklıma ilk gelenler, eminim başkaları da vardır) normal nesneler değildir. Bunu görmek için basit bir test betiği oluşturun:



    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
    <script type="text/javascript">
      $(function() {
        alert("Math: " + Math);
        alert("Math: " + Math.sqrt);
        alert("Date: " + Date);
        alert("Array: " + Array);
        alert("jQuery: " + jQuery);
        alert("Document: " + document);
        alert("Document: " + document.ready);
      });
    </script>

Belgenin genel olarak yaptığı gibi bir nesne olarak sunulduğunu görürsünüz, ancak aslında bu nesneyi görmeye çalıştığınızda, bunun yerel kod olduğunu ve numaralandırma için aynı şekilde gösterilmeyen bir şey olduğunu görürsünüz.

Yorumlar (0)