Найкращий спосіб перевірити екземпляр об’єкта - через оператор instanceof або за допомогою методу isPrototypeOf (), який перевіряє, чи є прототип об'єкта в ланцюзі прототипу іншого об'єкта.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Але іноді це може вийти з ладу у випадку декількох випадків jQuery документа. Як згадував @Georgiy Ivankin:
якщо я маю $в моєму поточному просторі імен вказівку jQuery2і я маю об'єкт із зовнішнього простору імен (де $є 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));
}
Давайте подивимось на: Логічні оператори та truthy / фальшивість
selectorвластивість давно застаріло та видалено в 3.0. Навіть у попередніх версіях об’єкт jQuery може мати порожню селекторну рядок, наприклад,$(window)не має селектора. Використовуйтеinstanceofзамість цього.