Is er een snelle manier om te controleren of een object een jQuery-object of een native JavaScript-object is?
voorbeeld:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
het is duidelijk dat de bovenstaande code werkt, maar het is niet veilig. U kunt mogelijk een selectiesleutel toevoegen aan het o
-object en hetzelfde resultaat krijgen. Is er een betere manier om ervoor te zorgen dat het object daadwerkelijk een jQuery-object is?
Iets in lijn met (typeof obj == 'jquery')
Antwoord 1, autoriteit 100%
U kunt de instanceof
operator:
if (obj instanceof jQuery){
console.log('object is jQuery');
}
Uitleg: de functie jquery
(ook bekend als $
) is geïmplementeerd als een constructorfunctie. Constructorfuncties moeten worden aangeroepen met het voorvoegsel new
.
Als je $(foo)
aanroept, vertaalt jQuery dit intern naar new jQuery(foo)
1. JavaScript initialiseert this
binnen de constructorfunctie om te verwijzen naar een nieuwe instantie van jquery
, waarbij de eigenschappen worden ingesteld op die gevonden op jQuery.prototype
( ook bekend als jQuery.fn
). U krijgt dus een new
-object waarbij instanceof jQuery
true
is.
1Het is eigenlijk new jQuery.prototype.init(foo)
: de constructorlogica is overgedragen aan een andere constructorfunctie genaamd init
, maar het concept is hetzelfde.
Antwoord 2, autoriteit 12%
U kunt ook de eigenschap .jquery gebruiken zoals hier beschreven: 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! ');
}
Antwoord 3, autoriteit 3%
Bekijk de instanceof-operator.
var isJqueryObject = obj instanceof jQuery
Antwoord 4, autoriteit 3%
De beste manier om de instantie van een object te controleren is via instanceofoperatorof met de methode isPrototypeOf()die inspecteert of het prototype van een object zich in de prototypeketen van een ander object bevindt.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Maar soms kan het mislukken in het geval van meerdere jQuery-instanties in een document. Zoals @Georgiy Ivankin al zei:
als ik
$
in mijn huidige naamruimte heb die verwijst naarjQuery2
en ik heb een object uit de buitenste naamruimte (waar$
isjQuery1
) dan kan ikinstanceof
niet gebruiken om te controleren of dat object eenjquery
-objectis
Een manier om dat probleem op te lossen is door het jQuery-object een alias te geven in een sluitingof IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Een andere manier om dat probleem op te lossen is door de eigenschap jquery
in obj
op te vragen.
'jquery' in obj
Als u die controle echter probeert uit te voeren met primitieve waarden, zal er een fout optreden, dus u kunt de vorige controle wijzigen door ervoor te zorgen dat obj
een Object
is
'jquery' in Object(obj)
Hoewel de vorige manier niet de veiligste is (u kunt de eigenschap 'jquery'
in een object maken), kunnen we de validatie verbeteren door met beide benaderingen te werken:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Het probleem hier is dat elk object een eigenschap jquery
als eigen kan definiëren, dus een betere benadering zou zijn om in het prototype te vragen en ervoor te zorgen dat het object niet null
of undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Vanwege dwangzal de if
-instructie kortsluiting maken door de &&
-operator te evalueren wanneer obj
is een van de falsywaarden (null
, undefined
, false
, 0
, ""
), en gaat vervolgens verder met het uitvoeren van de andere validaties.
Eindelijk kunnen we een hulpprogramma-functie schrijven:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Laten we eens kijken naar: Logische operators en waarheidsgetrouw / vals
Antwoord 5
Er is echter nog een manier om het object in jQuery te controleren.
jQuery.type(a); //this returns type of variable.
Ik heb een voorbeeld gegeven om dingen te begrijpen, jsfiddle-link
Antwoord 6
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
Antwoord 7
Voor degenen die willen weten of een object een jQuery-object is zonder dat jQuery is geïnstalleerd, zou het volgende fragment het werk moeten doen:
function isJQuery(obj) {
// Each jquery object has a "jquery" attribute that contains the version of the lib.
return typeof obj === "object" && obj && obj["jquery"];
}
Antwoord 8
Je kunt controleren of het object is geproduceerd door JQuery met de eigenschap jquery
:
myObject.jquery // 3.3.1
=> retourneer het nummer van de JQuery-versie als het object is geproduceerd door JQuery.
=> anders retourneert het undefined
Antwoord 9
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE