2009-02-27 35 views
18

Tôi nghĩ đây sẽ là dễ dàng như:Cách xác định xem đối tượng JavaScript gốc có thuộc tính/phương thức không?

if(typeof(Array.push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
    // Firefox never gets here, but IE/Safari/Chrome/etc. do, even though 
    // the Array object has a push method! 
} 

Và nó hoạt động tốt trong Firefox, nhưng không phải trong IE, Chrome, Safari, Opera, họ trả lại tất cả các thuộc tính/phương pháp của mẹ đẻ Đối tượng mảng là 'không xác định' bằng cách sử dụng phép thử này.

Phương thức .hasOwnProperty (prop) chỉ hoạt động trên các phiên bản ... do đó nó không hoạt động, nhưng do dùng thử và lỗi, tôi nhận thấy rằng nó hoạt động.

//this works in Firefox/IE(6,7,8)/Chrome/Safari/Opera 
if(typeof(Array().push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
} 

Có gì không ổn với việc sử dụng cú pháp này để xác định xem một tài sản/phương pháp tồn tại trên một Native Object/~ "Class JavaScript" ~, hoặc là có một cách tốt hơn để làm điều này?

Trả lời

30

Trước hết, typeof là toán tử, không phải là hàm, do đó bạn không cần dấu ngoặc đơn. Thứ hai, truy cập nguyên mẫu của đối tượng.

alert(typeof Array.prototype.push); 
alert(typeof Array.prototype.foo); 

Khi bạn thực hiện typeof Array.push bạn đang thử nghiệm nếu đối tượng mảng chính nó có một phương pháp đẩy, không nếu trường hợp của mảng có một phương pháp đẩy.

+0

Thú vị ... Tôi đọc rằng .prototype chỉ để thêm thuộc tính/phương pháp mới vào đối tượng, tôi không nghĩ sử dụng typeof trên đó. ví dụ. mẫu thử nghiệm http://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

Nó cho rằng, có, nhưng không CHỈ cho rằng . Tôi khuyên bạn nên xem bài thuyết trình của Douglas Crockford về "Nâng cao Javascript" trong Nhà hát YUI (http://developer.yahoo.com/yui/theater/) - có một số công cụ "dưới mui xe" tuyệt vời ở đó, bao gồm cách nguyên mẫu đối tượng hoạt động. –

+1

điều này sẽ không thấy các thuộc tính được xác định trong nguyên mẫu gốc –

2

And it does work fine in Firefox

Đó chỉ là trùng hợp ngẫu nhiên! Bạn thường không thể mong đợi phương pháp của một nguyên mẫu cũng tồn tại trên hàm xây dựng.

if(typeof(Array().push) == 'undefined') 

Điều này gần như đúng, trừ khi bạn quên new, một mã nhận dạng JavaScript lâu năm. new Array().push hoặc [].push trong ngắn hạn, sẽ kiểm tra chính xác một phiên bản có phương pháp bạn muốn.

51

Cách thích hợp để kiểm tra xem một tài sản tồn tại:

if ('property' in objectVar) 
+1

Tôi đang tìm cách kiểm tra xem 'AddFavorite' có tồn tại trong window.external hay không, cho đến nay: alert ('AddFavorite' trong window.external) ; là tập lệnh duy nhất hoạt động! cảm ơn – Elmer

+1

Đây phải là câu trả lời được chấp nhận, nó hoạt động trong mọi trường hợp, không giống như câu trả lời được chấp nhận hiện tại. –

8

Các .hasOwnProperty có thể được truy cập trên proptotype của Array, nếu typeof là không đủ thành ngữ.

 

if (Array.prototype.hasOwnProperty('push')) { 
    // Native array has push property 
} 
 
+0

tùy chọn tốt - chỉ cần đảm bảo rằng điều này không được thử nghiệm trên các phần tử DOM trong các phiên bản cũ của IE mà không kiểm tra trước nếu đối tượng có phương thức '.hasOwnProperty()' http://msdn.microsoft.com/en- chúng tôi/thư viện/328kyd6z% 28VS.85% 29.aspx # CommunityContentHeader – scunliffe

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