Najlepszym sposobem, aby sprawdzić instancję obiektu jest przez instanceof operatora lub metodą isPrototypeOf() który sprawdza, czy prototyp obiektu znajduje się w łańcuchu prototypów innego obiektu.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Ale czasami może zawieść w przypadku wielu instancji jQuery na dokumencie.Jak @Georgiy Ivankin wymienić:
jeśli mam $
w moim obecnym nazw wskazując jQuery2
i mam obiektu z zewnętrznej przestrzeni nazw (gdzie $
jest jQuery1
) wtedy nie mam sposobu korzystania instanceof
do sprawdzania, czy to obiekt jest jQuery
obiektowi
Jednym ze sposobów przezwyciężenia tego problemu jest przez aliasing obiekt jQuery w closure lub IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Inny sposobem na przezwyciężenie tego problemu jest dociekliwy właściwość jquery
w obj
'jquery' in obj
Jeśli jednak spróbować wykonać to sprawdzenie z wartościami prymitywnych, to wygeneruje błąd, tak możesz zmodyfikować poprzednie sprawdzanie, upewniając się, że obj
ma być Object
Chociaż poprzedni sposób nie jest najbezpieczniejszym (można utworzyć właściwość w obiekcie 'jquery'
), możemy poprawić walidację poprzez współpracę z obu podejść:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Problemem jest to, że każdy obiekt może zdefiniować nieruchomość jquery
jako własny, więc lepszym rozwiązaniem byłoby zapytać w prototypie, i upewnić się, że obiekt nie jest null
lub undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
związku z przymus, rachunek if
będzie zwarciem oceny operatora &&
gdy obj
oznacza jakiekolwiek falsy wartości (null
, undefined
, false
, 0
, ""
), a następnie przechodzi do wykonywania drugiej zatwierdzenia.
Wreszcie możemy napisać funkcję użytkową:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Rzućmy okiem na: Logical Operators and truthy/falsy
Z jQuery 3.0 zdecydowanie nie jest to właściwy sposób sprawdzenia, czy obiekt jest obiektem jQuery, ponieważ właściwość 'selector' została wycofana dawno temu i usunięta w wersji 3.0. Nawet we wcześniejszych wersjach obiekt jQuery może mieć pusty ciąg selektora, na przykład '$ (okno)' nie ma selektora. Zamiast tego użyj 'instanceof'. –