Controleer of het object een jQuery-object is

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 instanceofoperator:

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 thisbinnen 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 jQuerytrueis.


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 naar jQuery2en ik heb een object uit de buitenste naamruimte (waar $is jQuery1) dan kan ik instanceofniet gebruiken om te controleren of dat object een jquery-object

is

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 jqueryin 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 objeen Objectis

'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 jqueryals eigen kan definiëren, dus een betere benadering zou zijn om in het prototype te vragen en ervoor te zorgen dat het object niet nullof undefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }


Vanwege dwangzal de if-instructie kortsluiting maken door de &&-operator te evalueren wanneer objis 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

Other episodes