2009-02-27 17 views
18

Ben bu kadar kolay olacağını düşündüm olarak:Yerel JavaScript nesnesinin bir özellik/yöntem olup olmadığı nasıl belirlenir?

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! 
} 

Ve Firefox'ta ince işliyor, ama IE, Chrome, Safari, Opera yılında, onlar döndürmez tüm özellikler/yerli yöntemleri Bu testi kullanarak nesne nesnesini 'undefined' olarak tanımlayın.

.hasOwnProperty (prop) yöntemi yalnızca örneklerde çalışır ... bu nedenle çalışmaz, ancak deneme yanılma yoluyla bu çalışmanın farkına vardım.

//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 
} 

şey bir özellik/yöntem Yerli Nesne/~ "JavaScript Sınıfı" ~ vardır veya bunu yapmak için daha iyi bir yolu olup olmadığını belirlemek için bu sözdizimini kullanarak yanlış var mı?

cevap

30

Her şeyden önce, typeof bir işleve değil, bir işleve, dolayısıyla parantezlere ihtiyacınız yoktur. İkincisi, nesnenin prototipine erişin.

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

Array nesnesi kendisi itme yöntemi varsa test ettiğiniz typeof Array.push yürütmek

, Array örnekleri bir itme yöntemine sahip değilse.

+0

İlginç ... Okuduğumu okudum.prototype yalnızca nesneler için yeni özellikler/yöntemler eklemek içindi, üzerinde typeof kullanmayı düşünmedim. Örneğin. prototip http://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

Bunun için, evet, ama SADECE bunun için değil . Ben, Douglas Crockford'un YUI Theatre'daki "Gelişmiş Javascript" konulu sunusunu (http://developer.yahoo.com/yui/theater/) izlemenizi tavsiye ediyorum. Nesne prototiplerinin nasıl çalıştığı da dahil olmak üzere, bazı büyük "kaputun altında" şeyler var. –

+1

bu, üst prototip –

2

And it does work fine in Firefox

Bu yalnızca tesadüf! Genelde bir prototip yönteminin yapıcı işlevinde de bulunmasını bekleyemezsiniz.

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

Bu

Eğer new, uzun ömürlü bir JavaScript gotcha unutmak doğru haricinde neredeyse oldu. new Array().push, veya [].push kısaltması, istediğiniz yönteme sahip bir örneği doğru bir şekilde kontrol eder. typeof yeterince deyimsel değilse

if ('property' in objectVar) 
51

uygun yolu kontrol etmek.

+1

' AddFavorite 'olup olmadığını kontrol etmek için bir yol arıyordum, şu ana kadar window.external var: alert (' AddFavorite 'in window.external) ; , çalışan tek komut dosyasıdır! teşekkürler – Elmer

+1

Bu kabul edilen cevap olmalı, geçerli kabul edilen yanıtın aksine, her durumda çalışır. –

8

.hasOwnProperty, Dizisinin proptotype üzerinde erişilebilir: bir özellik varsa

+0

iyi bir seçenek - nesnenin '.hasOwnProperty()' yönteminin http://msdn.microsoft.com/tr olması durumunda ilk önce IE'nin eski sürümlerinde DOM öğelerinde sınanmadığından emin olmanız gerekir. tr/kütüphane/328kyd6z% 28VS.85% 29.aspx # CommunityContentHeader – scunliffe

İlgili konular