2009-02-27 16 views
18

मैंने सोचा था कि इस के रूप में आसान होगा के रूप में:कैसे निर्धारित करें कि मूल जावास्क्रिप्ट ऑब्जेक्ट में कोई संपत्ति/विधि है या नहीं?

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

और यह फ़ायरफ़ॉक्स में ठीक काम करता है, लेकिन नहीं आईई, क्रोम, सफारी, ओपेरा में, वे लौट सभी गुण/देशी के तरीके इस परीक्षण का उपयोग करके ऐरे ऑब्जेक्ट को 'अपरिभाषित' के रूप में।

.hasOwnProperty (prop) विधि केवल उदाहरणों पर काम करती है ... इसलिए यह काम नहीं करती है, लेकिन परीक्षण और त्रुटि से मैंने देखा कि यह काम करता है।

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

क्या निर्धारित करने के लिए एक संपत्ति/विधि एक मूल निवासी वस्तु/~ "जावास्क्रिप्ट कक्षा" ~ पर मौजूद है, या वहाँ यह करने के लिए एक बेहतर तरीका है इस सिंटैक्स का उपयोग के साथ कुछ गलत है?

उत्तर

30

सबसे पहले, टाइपोफ़ एक ऑपरेटर है, फ़ंक्शन नहीं है, इसलिए आपको कोष्ठक की आवश्यकता नहीं है। दूसरा, ऑब्जेक्ट के प्रोटोटाइप तक पहुंचें।

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

जब आप निष्पादित typeof Array.push यदि सरणी वस्तु अपने आप में एक धक्का विधि है आप परीक्षण कर रहे हैं, नहीं करता है, तो सरणी के उदाहरण एक धक्का विधि है।

+0

दिलचस्प ... मैंने इसे पढ़ा। प्रोटीोटाइप केवल वस्तुओं के लिए नई गुण/विधियों को जोड़ने के लिए था, मैंने इसका उपयोग करने के बारे में नहीं सोचा था। जैसे प्रोटोटाइप http://www.devguru.com/technologies/JavaScript/10764.asp टाइपऑफ http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

यह इसके लिए है, हां, लेकिन केवल इसके लिए नहीं । मैं यूयूआई रंगमंच (http://developer.yahoo.com/yui/theater/) में "उन्नत जावास्क्रिप्ट" पर डगलस क्रॉकफोर्ड की प्रस्तुति को देखने की अनुशंसा करता हूं - ऑब्जेक्ट प्रोटोटाइप कैसे काम करता है, इसमें कुछ बेहतरीन "हुड के नीचे" सामान है। –

+1

यह मूल प्रोटोटाइप –

2

And it does work fine in Firefox

यह केवल संयोग से है! आप आमतौर पर कन्स्ट्रक्टर फ़ंक्शन पर प्रोटोटाइप की विधि भी मौजूद होने की अपेक्षा नहीं कर सकते हैं।

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

इस अधिकार को छोड़कर आप new, एक बारहमासी जावास्क्रिप्ट पकड़ लिया भूल लगभग था। new Array().push, या [].push संक्षिप्त के लिए, एक विधि को सही ढंग से जांचने की विधि जांचेंगी।

if ('property' in objectVar) 
51

उचित तरीके से जांच करने के लिए।

 

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

मैं यह देखने के लिए एक तरीका ढूंढ रहा था कि 'AddFavorite' विंडो में मौजूद है या नहीं। अब तक: अलर्ट (window.external में 'AddFavorite') ; एकमात्र स्क्रिप्ट है जो काम करता है! धन्यवाद – Elmer

+1

यह स्वीकार्य उत्तर होना चाहिए, यह सभी स्वीकार्य उत्तर के विपरीत, सभी मामलों में काम करता है। –

8

.hasOwnProperty, सरणी के proptotype पर पहुँचा जा सकता है अगर typeof पर्याप्त मुहावरेदार नहीं है: क्या कोई संपत्ति मौजूद है

+0

अच्छा विकल्प - केवल यह सुनिश्चित करने की आवश्यकता है कि आईई के पुराने संस्करणों में डीओएम तत्वों पर परीक्षण नहीं किया गया है, यदि ऑब्जेक्ट में '.hasOwnProperty()' विधि http://msdn.microsoft.com/en- हमें/पुस्तकालय/328kyd6z% 28VS.85% 29.aspx # CommunityContentHeader – scunliffe

संबंधित मुद्दे

 संबंधित मुद्दे