Jika saya mengerti dengan benar, setiap objek di Javascript mewarisi dari prototipe Objek
Ini mungkin tampak seperti membelah rambut, tetapi ada perbedaan antara javascript (istilah umum untuk implementasi ECMAScript) dan ECMAScript (bahasa yang digunakan untuk implementasi javascript). ECMAScript yang menentukan skema pewarisan, bukan javascript, jadi hanya objek ECMAScript asli yang perlu menerapkan skema pewarisan tersebut.
Program javascript yang berjalan terdiri dari setidaknya objek ECMAScript bawaan (Objek, Fungsi, Angka, dll.) Dan mungkin beberapa objek asli (mis. Fungsi). Ini mungkin juga memiliki beberapa objek host (seperti objek DOM di browser, atau objek lain di lingkungan host lain).
Sementara objek bawaan dan bawaan harus menerapkan skema pewarisan yang ditentukan dalam ECMA-262, objek host tidak. Oleh karena itu, tidak semua objek dalam lingkungan javascript harus mewarisi dari Object.prototype . Misalnya, objek host di IE yang diimplementasikan sebagai objek ActiveX akan menampilkan kesalahan jika diperlakukan sebagai objek asli (oleh karena itu, mengapa try..catch digunakan untuk menginisialisasi objek MS XMLHttpRequest). Beberapa objek DOM (seperti NodeLists di IE dalam mode quirks) jika diteruskan ke metode Array akan memunculkan kesalahan, objek DOM di IE 8 dan yang lebih rendah tidak memiliki skema pewarisan seperti ECMAScript, dan seterusnya.
Oleh karena itu, tidak boleh diasumsikan bahwa semua objek dalam lingkungan javascript mewarisi dari Object.prototype.
yang berarti bahwa setiap objek di Javascript memiliki akses ke fungsi hasOwnProperty melalui rantai prototipenya
Yang tidak benar untuk objek host tertentu di IE dalam mode quirks (dan IE 8 dan yang lebih rendah selalu) setidaknya.
Mengingat hal di atas, ada baiknya merenungkan mengapa suatu objek mungkin memiliki metode hasOwnProperty sendiri dan kelayakan untuk memanggil beberapa metode hasOwnProperty lain daripada tanpa pengujian terlebih dahulu apakah itu ide yang bagus atau tidak.
Edit
Saya menduga bahwa alasan penggunaan Object.prototype.hasOwnProperty.call
adalah bahwa di beberapa browser, objek host tidak memiliki metode hasOwnProperty , menggunakan panggilan dan metode built-in merupakan alternatif. Namun, melakukannya secara umum sepertinya bukan ide yang baik untuk alasan yang disebutkan di atas.
Jika menyangkut objek host, operator in dapat digunakan untuk menguji properti secara umum, misalnya
var o = document.getElementsByTagName('foo');
// false in most browsers, throws an error in IE 6, and probably 7 and 8
o.hasOwnProperty('bar');
// false in all browsers
('bar' in o);
// false (in all browsers? Do some throw errors?)
Object.prototype.hasOwnProperty.call(o, 'bar');
Alternatif (diuji di IE6 dan lainnya):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
Dengan cara itu Anda hanya secara khusus memanggil hasOwnProperty built-in di mana objek tidak memilikinya (diwarisi atau sebaliknya).
Namun, jika sebuah objek tidak memiliki hasOwnProperty
metode, itu mungkin sama cocok untuk menggunakan operator in karena objek tersebut kemungkinan besar tidak memiliki skema pewarisan dan semua properti ada pada objek (meskipun itu hanya asumsi), misalnya in operator adalah cara umum (dan tampaknya berhasil) untuk menguji dukungan objek DOM untuk properti.