javascript - जांचें कि ऑब्जेक्ट एक jQuery ऑब्जेक्ट है या नहीं




(6)

क्या कोई ऑब्जेक्ट एक jQuery ऑब्जेक्ट या मूल जावास्क्रिप्ट ऑब्जेक्ट है या नहीं, यह जांचने का एक तेज़ तरीका है?

उदाहरण:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

जाहिर है, उपर्युक्त कोड काम करता है लेकिन यह सुरक्षित नहीं है। आप o ऑब्जेक्ट में संभावित रूप से चयनकर्ता कुंजी जोड़ सकते हैं और एक ही परिणाम प्राप्त कर सकते हैं। क्या यह सुनिश्चित करने का एक बेहतर तरीका है कि ऑब्जेक्ट वास्तव में एक jQuery ऑब्जेक्ट है?

लाइन के साथ कुछ (typeof obj == 'jquery')


आप instanceof ऑपरेटर का उपयोग कर सकते हैं:

obj instanceof jQuery

स्पष्टीकरण : jQuery फ़ंक्शन (उर्फ $ ) को कन्स्ट्रक्टर फ़ंक्शन के रूप में कार्यान्वित किया जाता है। new उपसर्ग के साथ रचनाकार कार्यों को बुलाया जाना है।

जब आप $(foo) , तो आंतरिक रूप से jQuery इसे new jQuery(foo) 1 में अनुवाद करता है । जावास्क्रिप्ट को jQuery एक नए उदाहरण को इंगित करने के लिए इसे कन्स्ट्रक्टर फ़ंक्शन के अंदर प्रारंभ करने के लिए प्राप्त होता है, जो jQuery.prototype (उर्फ jQuery.prototype ) पर पाए गए लोगों को इसकी गुण सेट करता है। इस प्रकार, आपको एक new वस्तु मिलती है जहां instanceof jQuery का instanceof jQuery true

1 यह वास्तव में new jQuery.prototype.init(foo) : कन्स्ट्रक्टर तर्क को new jQuery.prototype.init(foo) नामक किसी अन्य कन्स्ट्रक्टर फ़ंक्शन पर ऑफ़लोड किया गया है, लेकिन अवधारणा वही है।


आप यहां वर्णित .jquery संपत्ति का भी उपयोग कर सकते हैं: http://api.jquery.com/jquery-2/

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it's undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it's a string
    alert(' b is a jQuery object! ');
}

ऑपरेटर के instanceof

var isJqueryObject = obj instanceof jQuery

ऑब्जेक्ट का उदाहरण जांचने का सबसे अच्छा तरीका instanceof ऑपरेटर के माध्यम से है या विधि के साथ isPrototypeOf() जो निरीक्षण करता है कि किसी ऑब्जेक्ट का प्रोटोटाइप किसी अन्य ऑब्जेक्ट की प्रोटोटाइप श्रृंखला में है या नहीं।

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

लेकिन कभी-कभी दस्तावेज़ पर कई jQuery उदाहरणों के मामले में यह असफल हो सकता है। @Georgiy Ivankin के रूप में उल्लेख किया है:

अगर मेरे पास jQuery2 ओर इशारा करते हुए मेरे वर्तमान नेमस्पेस में $ है और मेरे पास बाहरी नेमस्पेस (जहां $ jQuery1 $ है) से ऑब्जेक्ट है तो मेरे पास instanceof लिए instanceof का उपयोग करने का कोई तरीका नहीं है कि यह ऑब्जेक्ट एक jQuery ऑब्जेक्ट है या नहीं

उस समस्या को दूर करने का एक तरीका है jQuery ऑब्जेक्ट को closure या IIFE में अलियासिंग करना

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

ओबीजे में jquery संपत्ति की जांच करके उस समस्या को दूर करने का दूसरा तरीका है

'jquery' in obj

हालांकि, यदि आप प्राचीन मूल्यों के साथ उस जांच को करने का प्रयास करते हैं, तो यह एक त्रुटि फेंक देगा, ताकि आप Object होने के लिए obj सुनिश्चित करके पिछली जांच को संशोधित कर सकें

'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 स्टेटमेंट && ऑपरेटर का मूल्यांकन करके शॉर्ट सर्किट करेगा, if ओबीजे किसी भी false मूल्य ( null , undefined , false , 0 , "" ) है, और फिर अन्य मान्यताओं को करने के लिए आगे बढ़ता है।

अंत में हम एक उपयोगिता समारोह लिख सकते हैं:

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

आइए देखें: लॉजिकल ऑपरेटर और सच्चाई / झूठी


return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE





jquery