Cách tốt nhất để kiểm tra thể hiện của một đối tượng là thông qua toán tử instanceof hoặc với phương thức isPrototypeOf () để kiểm tra xem nguyên mẫu của một đối tượng có nằm trong chuỗi nguyên mẫu của đối tượng khác hay không.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Nhưng đôi khi nó có thể thất bại trong trường hợp có nhiều phiên bản jQuery trên một tài liệu. Như @Georgiy Ivankin đã đề cập:
nếu tôi có $
trong không gian tên hiện tại của tôi trỏ đến jQuery2
và tôi có một đối tượng từ không gian tên bên ngoài ( $
thì là jQuery1
) thì tôi không có cách nào để sử dụng instanceof
để kiểm tra xem đối tượng đó có phải là một jQuery
đối tượng không
Một cách để khắc phục vấn đề đó là bằng cách đặt bí danh cho đối tượng jQuery trong bao đóng hoặc IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Một cách khác để khắc phục vấn đề đó là tìm hiểu jquery
tài sảnobj
'jquery' in obj
Tuy nhiên, nếu bạn cố gắng thực hiện kiểm tra đó với các giá trị nguyên thủy, nó sẽ gây ra lỗi, vì vậy bạn có thể sửa đổi kiểm tra trước đó bằng cách đảm bảo obj
là mộtObject
'jquery' in Object(obj)
Mặc dù cách trước đó không an toàn nhất (bạn có thể tạo thuộc 'jquery'
tính trong một đối tượng), chúng tôi có thể cải thiện xác thực bằng cách làm việc với cả hai phương pháp:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Vấn đề ở đây là bất kỳ đối tượng nào cũng có thể định nghĩa một thuộc tính jquery
là của riêng mình, vì vậy cách tiếp cận tốt hơn sẽ là hỏi trong nguyên mẫu và đảm bảo rằng đối tượng đó không null
hoặcundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Do sự ép buộc , các if
tuyên bố sẽ làm ngắn mạch bằng cách đánh giá các &&
nhà điều hành khi obj
là bất kỳ falsy giá trị ( null
, undefined
, false
, 0
, ""
), và sau đó tiến hành để thực hiện việc kiểm chứng thực khác.
Cuối cùng chúng ta có thể viết một hàm tiện ích:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Chúng ta hãy xem: Toán tử logic và trung thực / giả
selector
tính đã bị từ chối từ lâu và bị xóa trong 3.0. Ngay cả trong các phiên bản trước, một đối tượng jQuery có thể có một chuỗi bộ chọn trống, ví dụ$(window)
không có bộ chọn. Sử dụnginstanceof
thay thế.