Найкращий спосіб перевірити екземпляр об’єкта - через оператор 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
замість цього.