Проверьте, является ли объект объектом jQuery
есть ли быстрый способ проверить, является ли объект объектом 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')
8 ответов
вы также можете использовать .свойство 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
и у меня есть объект из космического пространства (где$
isjQuery1
), то у меня нет возможности использоватьinstanceof
для проверки, является ли этот объектjQuery
объект
один из способов преодолеть эту проблему-сглаживание объекта jQuery в закрытие или жизнь
//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)) { }
Из-за принуждение, the if
заявление сделает короткое замыкание путем оценивать &&
оператора obj
любое ложь значения (null
, undefined
, false
, 0
, ""
), а затем приступает к выполнению другого корректность.
наконец, мы можем записать функцию полезности:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
давайте посмотрим на: логические операторы и истина / ложь
однако, есть еще один способ проверить объект в jQuery.
jQuery.type(a); //this returns type of variable.
Я сделал пример, чтобы понять вещи, jsfiddle link
для тех, кто хочет знать, является ли объект объектом 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"];
}
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE