Cara terbaik untuk memeriksa instance objek adalah melalui instanceof operator atau dengan metode isPrototypeOf () yang memeriksa apakah prototipe objek berada dalam rantai prototipe objek lain.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Tetapi kadang-kadang mungkin gagal dalam kasus beberapa contoh jQuery pada dokumen. Seperti yang disebutkan @Georgiy Ivankin:
jika saya memiliki $
di saya saat namespace menunjuk ke jQuery2
dan saya memiliki objek dari namespace luar (di mana $
adalah jQuery1
) maka saya tidak punya cara untuk menggunakan instanceof
untuk memeriksa apakah benda adalah jQuery
objek
Salah satu cara untuk mengatasi masalah itu adalah dengan aliasing objek jQuery dalam penutupan atau IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Cara lain untuk mengatasi masalah itu adalah dengan menanyakan jquery
properti diobj
'jquery' in obj
Namun, jika Anda mencoba melakukan pengecekan dengan nilai-nilai primitif, itu akan menimbulkan kesalahan, sehingga Anda dapat memodifikasi pemeriksaan sebelumnya dengan memastikan obj
menjadiObject
'jquery' in Object(obj)
Meskipun cara sebelumnya bukan yang paling aman (Anda dapat membuat 'jquery'
properti di objek), kami dapat meningkatkan validasi dengan bekerja dengan kedua pendekatan:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Masalahnya di sini adalah bahwa objek apa pun dapat mendefinisikan properti jquery
sebagai miliknya, jadi pendekatan yang lebih baik adalah dengan bertanya dalam prototipe, dan memastikan bahwa objek tersebut tidak null
atauundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Karena paksaan , yang if
pernyataan akan membuat hubungan pendek dengan mengevaluasi &&
operator saat obj
ini salah satu falsy nilai ( null
, undefined
, false
, 0
, ""
), dan kemudian mulai melakukan validasi lainnya.
Akhirnya kita dapat menulis fungsi utilitas:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Mari kita lihat: Operator Logika dan kebenaran / kepalsuan
selector
properti sudah lama ditinggalkan dan dihapus pada 3.0. Bahkan dalam versi sebelumnya, objek jQuery dapat memiliki string pemilih kosong, misalnya$(window)
tidak memiliki pemilih. Gunakaninstanceof
sebagai gantinya.