Apakah ada cara cepat untuk memeriksa apakah suatu objek adalah objek jQuery atau objek JavaScript asli?
contoh:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
jelas, kode di atas berfungsi tetapi tidak aman. Anda berpotensi menambahkan kunci pemilih ke o
objek dan mendapatkan hasil yang sama. Apakah ada cara yang lebih baik untuk memastikan bahwa objek tersebut sebenarnya adalah objek jQuery?
Sesuatu yang sejalan (typeof obj == 'jquery')
javascript
jquery
David Hellsing
sumber
sumber
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.Jawaban:
Anda dapat menggunakan
instanceof
operator:Penjelasan :
jQuery
fungsi (alias$
) diimplementasikan sebagai fungsi konstruktor . Fungsi konstruktor harus dipanggil dengannew
awalan.Saat Anda menelepon
$(foo)
, secara internal jQuery menerjemahkannya kenew jQuery(foo)
1 . JavaScript melanjutkan untuk menginisialisasithis
di dalam fungsi konstruktor untuk menunjuk ke instance barujQuery
, mengatur properti itu ke yang ditemukan dijQuery.prototype
(aliasjQuery.fn
). Dengan demikian, Anda mendapatkannew
objek di manainstanceof jQuery
adalahtrue
.1 Sebenarnya
new jQuery.prototype.init(foo)
: logika konstruktor telah diturunkan ke fungsi konstruktor lain yang disebutinit
, tetapi konsepnya sama.sumber
if (obj instanceof jQuery){...}
?typeof jQuery === 'function' && obj instanceof jQuery
karenajQuery
tidak harus dideklarasikan agartypeof
operator dapat bekerja tanpa membuat kesalahan.Anda juga dapat menggunakan properti .jquery seperti dijelaskan di sini: http://api.jquery.com/jquery-2/
sumber
b instanceof jQuery
melempar ReferenceError jika jQuery tidak tersedia di halaman. Kedua pendekatan ini bermanfaat dalam berbagai kasus.try ... catch
, khususnya di oldIE.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
akan menjadi simpul DOM, sepertidocument.body
dan kemudian, secara teoritis ada kemungkinanjquery
kunci entah bagaimana menjadi ontop dari rantai simpul itu.Lihat instance operator.
sumber
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.
Tetapi kadang-kadang mungkin gagal dalam kasus beberapa contoh jQuery pada dokumen. Seperti yang disebutkan @Georgiy Ivankin:
Salah satu cara untuk mengatasi masalah itu adalah dengan aliasing objek jQuery dalam penutupan atau IIFE
Cara lain untuk mengatasi masalah itu adalah dengan menanyakan
jquery
properti diobj
Namun, jika Anda mencoba melakukan pengecekan dengan nilai-nilai primitif, itu akan menimbulkan kesalahan, sehingga Anda dapat memodifikasi pemeriksaan sebelumnya dengan memastikan
obj
menjadiObject
Meskipun cara sebelumnya bukan yang paling aman (Anda dapat membuat
'jquery'
properti di objek), kami dapat meningkatkan validasi dengan bekerja dengan kedua pendekatan: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 tidaknull
atauundefined
Karena paksaan , yang
if
pernyataan akan membuat hubungan pendek dengan mengevaluasi&&
operator saatobj
ini salah satu falsy nilai (null
,undefined
,false
,0
,""
), dan kemudian mulai melakukan validasi lainnya.Akhirnya kita dapat menulis fungsi utilitas:
Mari kita lihat: Operator Logika dan kebenaran / kepalsuan
sumber
||
salah satu dari itu dengan'jquery' in Object(obj)
,, itu akan mengalir, karena itu tidak akan mencegah objek non-jQuery dengan properti itu melewati verifikasi. Saya percaya memeriksa properti itu dalam prototipe meningkatkan situasi. Mungkin Anda harus menambahkan itu ke jawaban Anda! Saya tidak berpikir ada jawaban lain di sini yang menyebutkan kemungkinan itu :)obj.__proto__.jquery
bukannyaobj.constructor.prototype.jquery
cukup? hanya agak pendek :)constructor.prototype
karenaobj
seharusnya menjadi contoh dari konstruktor, yaitujQuery
. Di sisi lain__proto__
tersedia untuk semua jenis objek.sumber
nodeType
properti yang lebih baik , dan untuk memastikanboolean
nilai dikembalikan, Anda dapat menggunakan negasi ganda!!(el && el.nodeType)
Namun, ada satu lagi cara untuk memeriksa objek di jQuery.
Saya telah membuat contoh untuk memahami hal-hal, tautan jsfiddle
sumber
Bagi mereka yang ingin tahu apakah suatu objek adalah objek jQuery tanpa menginstal jQuery, cuplikan berikut harus melakukan pekerjaan:
sumber
Anda dapat memeriksa apakah objek tersebut diproduksi oleh JQuery dengan
jquery
properti:=> mengembalikan nomor versi JQuery jika objek yang dihasilkan oleh JQuery. => sebaliknya, ia kembali
undefined
sumber
sumber