Najlepszym sposobem sprawdzenia wystąpienia obiektu jest operator instanceof lub metoda to ProtrotOf (), która sprawdza, czy prototyp obiektu znajduje się w łańcuchu prototypów innego obiektu.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Ale czasami może się nie powieść w przypadku wielu instancji jQuery w dokumencie. Jak wspomniał @Georgiy Ivankin:
jeśli $w mojej bieżącej przestrzeni nazw wskazuję jQuery2i mam obiekt z zewnętrznej przestrzeni nazw (gdzie $jest jQuery1), to nie mam sposobu, aby instanceofsprawdzić, czy ten obiekt jest jQueryobiektem
Jednym ze sposobów rozwiązania tego problemu jest aliasing obiektu jQuery w zamknięciu lub IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Innym sposobem rozwiązania tego problemu jest zapytanie o jquerynieruchomość wobj
'jquery' in obj
Jeśli jednak spróbujesz przeprowadzić sprawdzanie z wartościami pierwotnymi, wygeneruje błąd, więc możesz zmodyfikować poprzednie sprawdzenie, upewniając objsię, żeObject
'jquery' in Object(obj)
Chociaż poprzedni sposób nie jest najbezpieczniejszy (możesz utworzyć 'jquery'właściwość w obiekcie), możemy poprawić sprawdzanie poprawności, pracując z obiema metodami:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Problem polega na tym, że każdy obiekt może zdefiniować właściwość jqueryjako własną, dlatego lepszym rozwiązaniem byłoby zapytanie w prototypie i upewnienie się, że obiekt nie jest nulllubundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Ze względu na przymus The ifstwierdzenie uczyni zwarcie poprzez ocenę &&operatora kiedy objto każdy z falsy wartości ( null, undefined, false, 0,"" ), a następnie przechodzi do wykonywania innych walidacji.
Wreszcie możemy napisać funkcję narzędzia:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Spójrzmy na: Operatory logiczne i prawda / fałsz
selectorwłaściwość została dawno przestarzała i usunięta w 3.0. Nawet we wcześniejszych wersjach obiekt jQuery może mieć pusty ciąg selektora, na przykład$(window)nie ma selektora. Użyjinstanceofzamiast tego.