2010-05-02 11 views
27

मैं स्प्राइट्स की एक श्रृंखला पर एक संपत्ति को पढ़ने का प्रयास कर रहा हूं। यह संपत्ति इन वस्तुओं पर मौजूद हो सकती है या नहीं भी हो सकती है, और इसे घोषित करने से भी बदतर घोषित नहीं किया जा सकता है।मैं अपने मूल्य को पढ़ने से पहले किसी ऑब्जेक्ट पर कोई संपत्ति मौजूद होने पर परीक्षण कैसे करूं?

मेरे कोड है:

if (child["readable"] == true){ 
    // this Sprite is activated for reading 
} 

और इसलिए फ्लैश मुझे पता चलता है:

त्रुटि # 1069: संपत्ति चयन flash.display.Sprite पर नहीं मिला और वहाँ कोई डिफ़ॉल्ट मान है।

क्या यह जांचने का कोई तरीका है कि कोई संपत्ति अपना मूल्य पढ़ने से पहले मौजूद है या नहीं?

कुछ की तरह: AS3 में

if (child.isProperty("readable") && child["readable"] == true){ 
    // this Sprite is activated for reading 
} 

उत्तर

53

वस्तुओं hasOwnProperty विधि है जो एक स्ट्रिंग तर्क लेता है और true देता है यदि उद्देश्य यह है कि संपत्ति परिभाषित किया गया है।

if(myObj.hasOwnProperty("someProperty")) 
{ 
    // Do something 
} 
0

कुछ इस तरह का प्रयास करें: के रूप में यह गूगल में एक शीर्ष प्रतिक्रिया है

if (child["readable"] != null){ 

} 
+4

यह त्रुटियों का कारण बन सकता है यदि यह पहले स्थान पर मौजूद नहीं है। यदि आप 'var "में एक [" b "] ढूंढने की तरह गतिशील रूप से ऑब्जेक्ट बना रहे हैं, तो आपको त्रुटि दिखाई देगी: ऑब्जेक्ट = {ए:' 1 '}' – Daniel

+0

(यह काम नहीं कर रहा है) – Lego

+0

var a; ए = ए {ए: 1}; ट्रेस (एक ["बी"]), आउटपुट "अपरिभाषित" है, लेकिन कोई त्रुटि उत्पन्न नहीं करता है। तो, इस तरह से उपयोग करने में समस्या कहां है? –

1

इस जोड़ना।

आप अगर एक निरंतर नाम के लिए एक स्ट्रिंग का उपयोग मौजूद है की जाँच करने की कोशिश कर रहे हैं तो @Vishwas जी को

if (ClassName["ConstName"] !== undefined) { 
    ... 
} 
0

रिस्पांस (नहीं एक टिप्पणी क्योंकि कोड ब्लॉक टिप्पणी में समर्थित नहीं हैं) का उपयोग करें:

जैसा कि डैनियल ने बताया, यदि आपके उदाहरण में "ए" वस्तु पहले स्थान पर मौजूद नहीं है, तो "ए" पर "बी" तक पहुंचने का आपका प्रयास एक त्रुटि का कारण बन जाएगा। यह उन मामलों में होता है जहां आप एक गहरी संरचना की अपेक्षा कर रहे हैं, जैसे JSON ऑब्जेक्ट, उदाहरण के लिए, "content.social.avatar" प्रारूप हो सकता है। यदि "सामाजिक" मौजूद नहीं है, तो "content.social.avatar" तक पहुंचने का प्रयास करने से त्रुटि हो जाएगी।

// Missing property "c". This is the "invalid data" case. 
var test1:Object = { a:{b:"hello"}}; 
// Has property "c". This is the "valid data" case. 
var test2:Object = { a:{b:{c:"world"}}}; 

अब:

यहाँ जहां "अनिर्धारित" दृष्टिकोण मामलों में त्रुटि हो सकती है, जहां "hasOwnProperty()" दृष्टिकोण नहीं है एक गहरे संरचना संपत्ति-अस्तित्व परीक्षण की एक सामान्य दर-मामला उदाहरण है परीक्षण ...

// ** Error ** (Because "b" is a String, not a dynamic 
// object, so ActionScript's type checker generates an error.) 
trace(test1.a.b.c); 
// Outputs: world 
trace(test2.a.b.c); 

// ** Error **. (Because although "b" exists, there's no "c" in "b".) 
trace(test1.a && test1.a.b && test1.a.b.c); 
// Outputs: world 
trace(test2.a && test2.a.b && test2.a.b.c); 

// Outputs: false. (Notice, no error here. Compare with the previous 
// misguided existence-test attempt, which generated an error.) 
trace(test1.hasOwnProperty("a") && test1.a.hasOwnProperty("b") && test1.a.b.hasOwnProperty("c")); 
// Outputs: true 
trace(test2.hasOwnProperty("a") && test2.a.hasOwnProperty("b") && test2.a.b.hasOwnProperty("c")); 

ध्यान दें कि एक्शनस्क्रिप्ट की भाई भाषा जावास्क्रिप्ट test1 उदाहरण में कोई त्रुटि उत्पन्न नहीं करेगा। हालांकि, यदि आप ऑब्जेक्ट पदानुक्रम को एक और स्तर तक बढ़ाते हैं, तो आप जावास्क्रिप्ट में भी त्रुटियों में टक्कर लेंगे:

// ** Error (even in JavaScript) ** because "c" doesn't even exist, so 
// test1.a.b.c.d becomes an attempt to access a property on undefined, 
// which always yields an error. 
alert(test1.a.b.c.d) 

// JavaScript: Uncaught TypeError: Cannot read property 'd' of undefined 
संबंधित मुद्दे

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