अनाम वस्तु की विधि है तो कैसे जांचें?


145

यदि कोई अनाम वस्तु जो इस तरह बनाई गई थी, तो मैं कैसे जांच सकता हूं:

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

क्या वास्तव में एक प्रोप 2 परिभाषित किया गया है?

prop2 हमेशा एक फ़ंक्शन के रूप में परिभाषित किया जाएगा, लेकिन कुछ वस्तुओं के लिए इसकी आवश्यकता नहीं है और इसे परिभाषित नहीं किया जाएगा।

मैंने कोशिश की कि यहाँ क्या सुझाव दिया गया था: यह निर्धारित करने के लिए कि मूल निवासी ऑब्जेक्ट के पास संपत्ति / विधि है या नहीं? लेकिन मुझे नहीं लगता कि यह अनाम वस्तुओं के लिए काम करता है।


6
जावास्क्रिप्ट में अनाम और गैर-अनाम वस्तुओं के बीच बहुत अंतर नहीं है। वे कवर के नीचे समान हैं।
वाव

जवाबों:


278

typeof myObj.prop2 === 'function'; आपको बताएगा कि क्या फ़ंक्शन परिभाषित है।

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

1
यदि आप डायनामिक वैरिएबलif(typeof myObj[propoeryStr] === 'function') { ... }
विवेक

42

आप चाहते हैं hasOwnProperty():

var myObj1 = { 
	prop1: 'no',
	prop2: function () { return false; }
}
var myObj2 = { 
	prop1: 'no'
}

console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false
	

संदर्भ: मोज़िला , माइक्रोसॉफ्ट , phrogz.net


4
इस करता है, तो आप एक स्व-निर्मित वस्तु के भीतर एक डोम नोड रखा है, उदाहरण के लिए अगर काम नहीं करेंगे var my_obj = {'node1': document.createElement('div')};तो my_obj.node1.hasOwnProperty('cloneNode')गलत है। हालांकि शॉन का समाधान सही रूप से सही वापस आ जाएगा:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
यदि आप किसी ऐसे तरीके की तलाश में हैं, जो प्रोटोटाइप में परिभाषित किया गया है तो काम नहीं करेगा।
विल्ट

2
@ विशिष्ट प्रश्न निर्दिष्ट अनाम वस्तु शाब्दिक है।
आर्टलंग

4
@artlung हाँ, आपका उत्तर प्रश्न के लिए अच्छा है, बस उस टिप्पणी को दूसरों के लिए यहाँ छोड़ना चाहता था जो अन्य मामलों में काम करने वाले समान समाधान की तलाश में हो सकते हैं (मेरे जैसे) ... आपके उत्तर को अयोग्य ठहराने का मतलब नहीं था।
विल्ट

2
उस मामले को नहीं संभालता है जहां संपत्ति परिभाषित की गई है, लेकिन एक फ़ंक्शन नहीं है।
मटका २२

15

3 विकल्प

  1. typeof myObj.prop2 === 'function' यदि संपत्ति का नाम गतिशील / उत्पन्न नहीं है
  2. myObj.hasOwnProperty('prop2') यदि संपत्ति का नाम गतिशील है, और केवल तभी जांचें कि यह प्रत्यक्ष संपत्ति है (प्रोटोटाइप श्रृंखला से नीचे नहीं)
  3. 'prop2' in myObj यदि संपत्ति का नाम गतिशील है, और प्रोटोटाइप श्रृंखला की जांच करें

8

"अनाम वस्तु" से आपका क्या तात्पर्य है? myObjअनाम नहीं है क्योंकि आपने किसी वस्तु को शाब्दिक रूप से एक चर में सौंपा है। आप इसका परीक्षण कर सकते हैं:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}


0

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मुझे आश्चर्य है कि सभी उत्तर सुनिश्चित करते हैं कि विधि मौजूद है और यह एक फ़ंक्शन है, जब ओपी केवल अस्तित्व की जांच करना चाहता है। यह जानने के लिए कि यह एक फ़ंक्शन है (जैसा कि कई ने कहा है) आप उपयोग कर सकते हैं:

typeof myObj.prop2 === 'function'

लेकिन आप एक शर्त के रूप में भी उपयोग कर सकते हैं:

typeof myObj.prop2

या और भी:

myObj.prop2

ऐसा इसलिए है क्योंकि एक फ़ंक्शन का मूल्यांकन करता है trueऔर उसका मूल्यांकन undefinedकरता है false। इसलिए यदि आप जानते हैं कि यदि सदस्य मौजूद है तो यह केवल एक कार्य हो सकता है, आप इसका उपयोग कर सकते हैं:

if(myObj.prop2) {
  <we have prop2>
}

या एक अभिव्यक्ति में:

myObj.prop2 ? <exists computation> : <no prop2 computation>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.