Pernyataan for in digunakan untuk membuat daftar properti (anggota) suatu objek, sebagai berikut
Copy kode kodenya sebagai berikut:
var obj = { nama:"jack",
getName:function(){kembalikan ini.nama}
};
//Nama keluaran,dapatkanNama
untuk(var atr di obj) {
peringatan(atr);
}
Apakah Anda memperhatikan bahwa tidak ada properti bawaan (atau anggota bawaan, properti tersembunyi, dan properti yang telah ditentukan sebelumnya) seperti toString dan valueOf dari objek. Artinya, for in digunakan untuk menghitung anggota yang ditampilkan (anggota khusus) dari objek.
Jika Anda mengganti properti bawaan, tulis ulang toString objek di bawah.
Copy kode kodenya sebagai berikut:
var obj = {nama:"jack",
getName:function(){kembalikan ini.nama},
toString:function(){return "Saya jack."}
}
untuk(var atr di obj) {
peringatan(atr);
}
Apa yang akan menjadi keluaran?
1. Di bawah IE6/7/8, sama seperti tanpa menulis ulang toString, dan masih hanya menampilkan nama dan getName.
2. Di bawah IE9/Firefox/Chrome/Opera/Safari, nama, getName, toString adalah output
Jika Anda menambahkan properti/metode ke prototipe bawaan, properti/metode tersebut juga akan dapat ditelusuri selama for in
Copy kode kodenya sebagai berikut:
Objek.prototipe.klon = fungsi() {}
var objek = {
nama: 'jack',
usia: 33
}
// nama, umur, klon
untuk (var n di obj) {
peringatan (n)
}
Metode clone ditambahkan ke Object.prototype, dan semua browser menampilkan clone ketika for in.
Ini mungkin tidak menjadi masalah, karena umumnya tidak disarankan untuk memperluas prototipe konstruktor bawaan, yang merupakan salah satu alasan penurunan Prototype.js. jQuery dan Garis Bawah tidak memperluas prototipe diri. Yang pertama membuat keributan tentang objek jQuery, sedangkan yang terakhir hanya menggantungkan semua metode di bawah garis bawah.
Namun terkadang, agar kompatibel dengan ES5 atau versi berikutnya, kami akan memperluas prototipe konstruktor bawaan pada browser yang tidak mendukung ES5 (IE6/7/8). setiap peramban. sebagai berikut
Copy kode kodenya sebagai berikut:
if (!Fungsi.prototipe.mengikat) {
Fungsi.prototipe.mengikat = fungsi(cakupan) {
var fn = ini
fungsi kembali () {
fn.apply(ruang lingkup, argumen)
}
}
}
fungsi salam(nama) {
alert(ini.sapa + ', ' + nama)
}
untuk (var n dalam salam) {
peringatan (n)
}
Output IE6/7/8 mengikat, tetapi browser lain tidak. Karena pengikatan secara asli didukung di browser modern, dan for in tidak tersedia, IE6/7/8 menambahkan pengikatan ke Function.prototype.
Untuk meringkas: Dalam desain lintas-browser, kita tidak bisa mengandalkan for in untuk mendapatkan nama anggota objek. Kita biasanya menggunakan hasOwnProperty untuk menilai.