Проверьте, является ли объект объектом jQuery - PullRequest
573 голосов
/ 05 декабря 2009

Существует ли быстрый способ проверки, является ли объект объектом jQuery или собственным объектом JavaScript?

пример:

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')

Ответы [ 9 ]

841 голосов
/ 05 декабря 2009

Вы можете использовать оператор instanceof:

obj instanceof jQuery

Объяснение : функция jQuery (она же $) реализована как функция конструктора . Функции конструктора должны вызываться с префиксом new.

Когда вы звоните $(foo), внутренне jQuery переводит это в new jQuery(foo) 1 . JavaScript продолжает инициализацию this внутри функции конструктора, чтобы указывать на новый экземпляр jQuery, устанавливая его свойства равными свойствам, найденным в jQuery.prototype (он же jQuery.fn). Таким образом, вы получаете объект new, где instanceof jQuery равно true.


1 На самом деле new jQuery.prototype.init(foo): логика конструктора выгружена в другую функцию конструктора с именем init, но концепция та же.

105 голосов
/ 22 июня 2011

Вы также можете использовать свойство .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! ');
}
30 голосов
/ 05 декабря 2009

Проверьте оператор instanceof .

var isJqueryObject = obj instanceof jQuery
24 голосов
/ 29 июля 2014

Лучший способ проверить экземпляр объекта - через instanceof оператор или с помощью метода isPrototypeOf () , который проверяет, является ли прототип объекта находится в цепочке прототипов другого объекта.

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

Но иногда это может дать сбой в случае нескольких экземпляров jQuery в документе. Как отметил @ Георгий Иванкин:

, если у меня есть $ в моем текущем пространстве имен, указывающем на 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));
}

Давайте посмотрим на: Логические операторы и правдивость / ложь

3 голосов
/ 17 августа 2017

Однако, есть еще один способ проверить объект в jQuery.

jQuery.type(a); //this returns type of variable.

Я сделал пример, чтобы понять вещи, jsfiddle link

3 голосов
/ 13 сентября 2012
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
2 голосов
/ 15 декабря 2017

Для тех, кто хочет знать, является ли объект объектом jQuery без установленного jQuery, следующий фрагмент должен выполнить эту работу:

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}
1 голос
/ 25 января 2019

Вы можете проверить, произведен ли объект JQuery с помощью свойства jquery:

myObject.jquery // 3.3.1

=> вернуть номер версии JQuery, если объект создан JQuery. => в противном случае возвращает undefined

0 голосов
/ 19 октября 2014
var elArray = [];
var elObjeto = {};

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

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...