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 jQuery2và 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 jquerytà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 objlà 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 jquerylà 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 nullhoặcundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Do sự ép buộc , các iftuyên bố sẽ làm ngắn mạch bằng cách đánh giá các &&nhà điều hành khi objlà 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ả
selectortí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ụnginstanceofthay thế.