2009-01-28 43 views
11

Tôi đang viết một hàm javascript và trong thời trang thiết kế javascript "nhỏ gọn", loại/độ dài của đối số thay đổi hành vi của hàm. Một kiểu có thể của đối số là một đối tượng jQuery, mà tôi muốn có logic rất đặc biệt.Cách chính xác/thích hợp để kiểm tra xem một đối tượng có phải là một đối tượng jQuery trong javascript không?

Cách tốt nhất để kiểm tra xem một đối tượng có phải là một thể hiện của jQuery không?

Trả lời

20

Phụ thuộc vào các hoạt động bên trong jQuery, nhưng tôi muốn đi với

obj instanceof jQuery 

Đó là nhất 'JavaScript cách' làm việc đó. Hãy nhớ rằng nó sẽ thất bại khi truyền các đối tượng giữa các ranh giới cửa sổ/khung!

gợi ý Tomalak của

'jquery' in obj 

vẫn nên làm việc trong trường hợp này, vì vậy bạn nên sử dụng nó nếu bạn mong đợi để làm nhiều cửa sổ trao đổi dữ liệu. Tôi sẽ không khuyên bạn nên nó như một giải pháp chung, như chỉ tìm kiếm một tài sản có tên 'jquery' không phải là rất đáng tin cậy.

Nhà điều hành in cũng sẽ gặp lỗi nếu obj là nguyên thủy. Nếu hành vi này là không mong muốn, bạn có thể xem xét sử dụng một trong các thử nghiệm này để thay thế:

obj && obj.jquery 
'jquery' in Object(obj) 

Tôi thấy thứ hai hấp dẫn hơn, nhưng cái thứ nhất có thể sẽ nhanh hơn.

Kiểm tra

Object(obj).hasOwnProperty('jquery') 

sẽ thất bại, như jQuery đối tượng chỉ thừa hưởng tài sản từ nguyên mẫu của họ.

tôi cũng không khuyến khích sử dụng constructor tài sản để kiểm tra kiểu trong JavaScript - nó có thể làm việc đáng tin cậy cho jQuery, nhưng như constructor chỉ là một tài sản của đối tượng được trỏ đến bởi tài sản prototype hàm xây dựng vào thời điểm instantiation, có rất nhiều cách để gây rối với xét nghiệm như vậy ...


như một mặt lưu ý:

jQuery tự kiểm tra cho obj && obj.jquery. Nó không sử dụng instanceof thậm chí một lần. Thay vào đó, nó sử dụng kết hợp của typeof, nhập liệu vịt và toString.call() để kiểm tra loại, điều này sẽ hoạt động ở nơi instanceof sẽ không thành công.

Ngoài ra, hasOwnProperty() cũng không bao giờ được sử dụng. Tôi không chắc điều này nói gì về chất lượng mã của thư viện jQuery;)

+1

Nhiều chi tiết hơn bài đăng của tôi: +1 và tôi khuyên bạn nên chọn bài đăng của mình làm câu trả lời – VonC

+0

Bạn đã bỏ phiếu vì đã đề cập đến sự thất bại của instanceof trên ranh giới cửa sổ/khung! –

+0

Vậy cái nào là tốt nhất? – Kato

6

Một trong những cách sau:

obj instanceof jQuery 
obj && obj.constructor == jQuery 
obj && obj.jquery 

instanceof is recommended

+0

Còn về: "jquery" trong obj? – Tomalak

+0

Tôi khuyên bạn nên chống lại việc sử dụng instanceof của chính nó vì có [rò rỉ bộ nhớ đã biết] (http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak) khi sử dụng instanceof trong IE. – kflorence

0

Sử dụng tính năng này thay vì instanceof để kiểm tra đối tượng jQuery.

/** 
* @see http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak 
* @return Boolean True if object is of type jQuery, false otherwise 
*/ 
function isjQuery(obj) { 
    return obj && obj.hasOwnProperty && obj instanceof jQuery; 
} 
+0

Tại sao một người nên sử dụng điều này thay vì instanceof? – Kato

+0

Vui lòng đọc liên kết được cung cấp trong nhận xét. – kflorence

Các vấn đề liên quan