วิธีที่ดีที่สุดในการตรวจสอบอินสแตนซ์ของวัตถุคือผ่านโอเปอเรเตอร์ของอินสแตนซ์หรือด้วยเมธอดisPrototypeOf ()ซึ่งตรวจสอบว่าต้นแบบของวัตถุอยู่ในห่วงโซ่ต้นแบบของวัตถุอื่นหรือไม่
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
แต่บางครั้งมันอาจล้มเหลวในกรณีของอินสแตนซ์ jQuery หลายรายการในเอกสาร ในฐานะ @Georgiy Ivankin พูดถึง:
ถ้าฉันมี$ใน namespace ปัจจุบันของฉันชี้ไปที่jQuery2และฉันมีวัตถุจาก namespace ด้านนอก (ที่$อยู่jQuery1) แล้วฉันไม่มีวิธีที่จะใช้instanceofสำหรับการตรวจสอบว่าวัตถุนั้นเป็นjQueryวัตถุ
วิธีหนึ่งที่จะเอาชนะปัญหานั้นได้คือการใช้นามแฝงวัตถุ jQuery ในการปิดหรือIIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
วิธีอื่นในการเอาชนะปัญหานั้นคือการสอบถามjqueryคุณสมบัติในobj
'jquery' in obj
อย่างไรก็ตามหากคุณพยายามทำการตรวจสอบด้วยค่าดั้งเดิมมันจะทำให้เกิดข้อผิดพลาดดังนั้นคุณสามารถแก้ไขการตรวจสอบก่อนหน้าได้โดยทำให้แน่ใจว่าobjเป็นObject
'jquery' in Object(obj)
แม้ว่าวิธีก่อนหน้านี้จะไม่ปลอดภัยที่สุด (คุณสามารถสร้าง'jquery'คุณสมบัติในวัตถุ) แต่เราสามารถปรับปรุงการตรวจสอบโดยการทำงานกับทั้งสองวิธี:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
ปัญหาที่นี่คือวัตถุใด ๆ ที่สามารถกำหนดคุณสมบัติjqueryเป็นของตัวเองดังนั้นวิธีที่ดีกว่าคือการถามในต้นแบบและให้แน่ใจว่าวัตถุนั้นไม่ได้nullหรือundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
เนื่องจากการบังคับของifคำสั่งที่จะทำให้ไฟฟ้าลัดวงจรโดยการประเมิน&&ผู้ประกอบการเมื่อobjมีการใด ๆ ของfalsyค่า ( null, undefined, false, 0, "") และจากนั้นก็จะดำเนินการตรวจสอบอื่น ๆ
ในที่สุดเราสามารถเขียนฟังก์ชั่นยูทิลิตี้:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
ลองดูที่: ผู้ประกอบการตรรกะและความจริง / เท็จ
selectorคุณสมบัติถูกเลิกใช้มานานแล้วและถูกลบใน 3.0 แม้ในรุ่นก่อนหน้าวัตถุ jQuery สามารถมีสตริงตัวเลือกที่ว่างเปล่าตัวอย่างเช่น$(window)ไม่มีตัวเลือก ใช้instanceofแทน