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 jQuery2dan saya memiliki objek dari namespace luar (di mana $adalah jQuery1) maka saya tidak punya cara untuk menggunakan instanceofuntuk memeriksa apakah benda adalah jQueryobjek
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 jqueryproperti 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 objmenjadiObject
'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 jquerysebagai miliknya, jadi pendekatan yang lebih baik adalah dengan bertanya dalam prototipe, dan memastikan bahwa objek tersebut tidak nullatauundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Karena paksaan , yang ifpernyataan akan membuat hubungan pendek dengan mengevaluasi &&operator saat objini 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
selectorproperti sudah lama ditinggalkan dan dihapus pada 3.0. Bahkan dalam versi sebelumnya, objek jQuery dapat memiliki string pemilih kosong, misalnya$(window)tidak memiliki pemilih. Gunakaninstanceofsebagai gantinya.