Saya ingin tahu bagaimana untuk membuat daftar semua metode yang tersedia untuk sebuah objek seperti misalnya:
alert(show_all_methods(Math));
Ini harus mencetak:
abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
Anda dapat menggunakan Object.getOwnPropertyNames()
untuk mendapatkan semua sifat yang dimiliki suatu benda, baik enumerable atau tidak. Misalnya:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
Anda kemudian dapat menggunakan filter()
untuk mendapatkan hanya metode:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
Di ES3 browser (IE 8 dan bawah), sifat-sifat built-in objek aren't enumerable. Benda-benda seperti jendela
dan dokumen
tidak't built-in, mereka're didefinisikan oleh browser dan kemungkinan besar enumerable dengan desain.
Dari ECMA-262 Edisi 3:
Objek Global Ada yang unik global objek (15.1), yang dibuat sebelum kontrol memasuki konteks eksekusi. Awalnya global yang memiliki objek sifat-sifat berikut:
• Built-in benda-benda seperti Matematika, String, Tanggal, parseInt, dll. Ini memiliki atribut { DontEnum }. • Tambahan tuan rumah didefinisikan sifat. Ini mungkin termasuk properti yang nilainya global obyek itu sendiri; misalnya, dalam HTML document object model jendela properti dari objek global adalah global objek itu sendiri.
Sebagai kontrol memasuki eksekusi konteks, dan sebagai ECMAScript kode dieksekusi, sifat tambahan dapat ditambahkan ke global objek dan awal sifat dapat berubah.
Saya harus menunjukkan bahwa ini berarti benda-benda aren't enumerable sifat-sifat objek Global. Jika anda melihat melalui sisa dari spesifikasi dokumen, anda akan melihat sebagian besar built-in properti dan metode dari objek-objek ini memiliki { DontEnum }
atribut yang ditetapkan pada mereka.
Update: sesama pengguna, CMS, membawa IE bug mengenai { DontEnum }
untuk perhatian saya.
Bukannya memeriksa DontEnum atribut, [Microsoft] JScript akan melewatkan setiap properti di objek mana ada yang bernama-sama properti di objek's prototipe rantai yang memiliki atribut DontEnum.
Singkatnya, berhati-hatilah ketika penamaan objek properti. Jika ada built-in prototipe properti atau metode dengan nama yang sama maka YAITU akan melewatkan ketika menggunakan untuk...dalam
lingkaran.
It's tidak mungkin dengan ES3 sebagai sifat internal DontEnum
atribut yang mencegah kita dari pada menyebutkan sifat-sifat ini. ES5, di sisi lain, menyediakan deskripsi properti untuk mengendalikan pencacahan kemampuan sifat sangat user-didefinisikan dan asli sifat dapat menggunakan antarmuka yang sama dan menikmati kemampuan yang sama, yang mencakup kemampuan untuk melihat non-enumerable sifat pemrograman.
The getOwnPropertyNames
fungsi dapat digunakan untuk menghitung atas semua sifat-sifat yang disahkan pada obyek, termasuk mereka yang non-enumerable. Kemudian sederhana jenis
check dapat digunakan untuk menyaring non-fungsi. Sayangnya, Chrome adalah browser yang bekerja pada saat ini.
function getAllMethods(object) {
return Object.getOwnPropertyNames(object).filter(function(property) {
return typeof object[property] == 'function';
});
}
console.log(getAllMethods(Math));
log ["cos", "pow", "log", "tan", "sqrt", "l", "asin", "abs", "max", "exp", "atan2", "random", "bulat", "lantai", "acos", "atan", "min", "dosa"]
tidak dalam urutan tertentu.
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function") {
methods.push(m);
}
}
alert(methods.join(","));
Dengan cara ini, anda akan mendapatkan semua metode yang dapat anda hubungi pada obj
. Ini termasuk metode yang seperti itu, "mewarisi" dari prototipe (seperti getMethods()
di jawa). Jika anda hanya ingin melihat metode-metode yang ditetapkan langsung oleh obj
anda dapat memeriksa dengan hasOwnProperty
:
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function" && obj.hasOwnProperty(m)) {
methods.push(m);
}
}
alert(methods.join(","));
Sebagian besar browser modern mendukung konsol.dir(obj)
, yang akan mengembalikan semua properti dari objek yang diwariskan melalui konstruktor. Melihat Mozilla's dokumentasi untuk info lebih lanjut dan saat ini dukungan browser.
js konsol.dir(Matematika) => MathConstructor E: 2.718281828459045 LN2: 0.6931471805599453 ... tan: fungsi tan() { [kode asli] } __proto__: Objek
Jawaban singkatnya adalah anda dapat't karena Matematika
dan Tanggal
(dari atas kepala saya, saya'm yakin ada orang lain) adalah't normal benda-benda. Untuk melihat ini, membuat tes sederhana script:
<html>
<body>
<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>
</body>
</html>
Anda melihat hadiah itu sebagai sebuah objek dengan cara yang sama dokumen tidak secara keseluruhan, tetapi ketika anda benar-benar mencoba dan melihat benda itu, anda melihat bahwa itu's kode asli dan sesuatu yang tidak terkena dengan cara yang sama untuk pencacahan.
Lain jawaban di sini bekerja untuk sesuatu seperti Matematika, yang merupakan objek statis. Tapi mereka don't bekerja untuk sebuah contoh sebuah objek, seperti saat ini. Saya menemukan berikut untuk bekerja:
function getMethods(o) {
return Object.getOwnPropertyNames(Object.getPrototypeOf(o))
.filter(m => 'function' === typeof o[m])
}
//example: getMethods(new Date()): [ 'getFullYear', 'setMonth', ... ]
Ini tidak't bekerja untuk sesuatu seperti pertanyaan awal (Matematika), sehingga memilih solusi anda berdasarkan kebutuhan anda. I'm postingan ini di sini karena Google akan mengirim saya untuk pertanyaan ini, tetapi saya ingin tahu bagaimana untuk melakukan hal ini untuk contoh dari benda-benda.
Saya percaya ada's sederhana historis alasan mengapa anda dapat't menghitung lebih dari metode-metode di benda-benda seperti Hotel misalnya. Berikut ini's mengapa:
Metode ini adalah sifat dari prototipe-objek, mengatakan Objek.prototipe. Itu berarti bahwa semua Obyek-kasus yang akan mewarisi metode tersebut. Yang's mengapa anda dapat menggunakan metode-metode pada objek apapun. Mengatakan .toString() misalnya.
Jadi, JIKA metode yang enumerable, dan saya akan iterate atas mengatakan {a:123} dengan: "untuk (key di {a:123}) {...}" apa yang akan terjadi? Berapa kali akan loop akan dieksekusi?
Itu akan mengulangi sekali untuk kunci tunggal 'a' dalam contoh kita. TAPI JUGA sekali untuk setiap enumerable properti dari Objek.prototipe. Jadi jika metode yang enumerable (by default), kemudian setiap lingkaran atas setiap objek akan loop di atas semua metode turunan serta.