2013-02-27 219 views
5

है या नहीं, मुझे यह जांचना होगा कि कोई चर एक शुद्ध ऑब्जेक्ट उदाहरण है या नहीं। उदाहरण के लिए: एक HTMLElement उदाहरण ऑब्जेक्ट है। लेकिन मुझे वास्तव में यह जांचने की ज़रूरत है कि यह केवल ऑब्जेक्ट है, जैसे {a: true, b: false} है। यह एक ऐरे को मान्य नहीं कर सकता है।जांचें कि कोई ऑब्जेक्ट

नोट: यदि बेहतर हो तो मैं क्रोम की नई सुविधाओं का उपयोग कर सकता हूं।

+0

क्यों आप ऐसा करने की जरूरत है? – hugomg

+0

क्या आप वास्तव में यह देखने का प्रयास कर रहे हैं कि कोई ऑब्जेक्ट होस्ट या मूल ऑब्जेक्ट है या नहीं? एक HTMLElement आवश्यक रूप से अंतर्निहित ऑब्जेक्ट ऑब्जेक्ट का उदाहरण नहीं है। तत्व होस्ट ऑब्जेक्ट्स हैं और इसलिए किसी विशेष विरासत पैटर्न का पालन करने की आवश्यकता नहीं है (और कुछ ब्राउज़र किसी भी को लागू नहीं करते हैं, न ही वे उन्हें ऑब्जेक्ट के उदाहरण के रूप में लागू करते हैं)। – RobG

+1

http://qui.jquery.com/jQuery.isPlainObject/ पर jquery http://code.jquery.com/jquery-1.9.1.js के स्रोत में देखें और तब तक यह प्रश्न बंद करें जब तक कि आप अंधे –

उत्तर

8

निर्माता को जांचें। Seems to work in all browsers

if (a.constructor === Object) 
// Good for arrays 
([]).constructor === Object => false 
// Good for HTMLElements 
document.body.constructor === Object => false 
+0

सभी उत्तरों के लिए धन्यवाद ... लेकिन यह मेरे लिए सही और तेज़ है। धन्यवाद! –

+0

कन्स्ट्रक्टर संपत्ति सेट की जा सकती है, इसलिए आसानी से खराब किया जा सकता है: 'var a = []; a.constructor = ऑब्जेक्ट; o.constructor === ऑब्जेक्ट; // true' – RobG

+1

@RobG निश्चित रूप से, जेएस के साथ पैर में खुद को शूट करने के लिए आप कई चीजें कर सकते हैं। आप 'ऑब्जेक्ट .__ proto__' को भी धोखा दे सकते हैं जिसे आपने सुझाव दिया है, लेकिन मुझे लगता है कि वास्तव में कुछ ऑब्जेक्ट बनाना होगा ??? –

2
var proto = Object.getPrototypeOf(obj); 

var protoproto = Object.getPrototypeOf(proto); 

if (proto === Object.prototype && protoproto === null) { 
    //plain object 
} 

आप एक null प्रोटोटाइप के साथ वस्तुओं बना रहे होते हैं, तो आप protoproto से छुटकारा पाने सकता है, और सिर्फ Object.prototype या null को proto की तुलना करें।

इसका खतरा यह है कि यह Object.prototype पास होने के खिलाफ सुरक्षा नहीं करता है, शायद Object.prototype के आकस्मिक एक्सटेंशन का कारण बनता है।


में थोड़ा छोटा और इस तरह सुरक्षित:

var proto = Object.getPrototypeOf(obj); 

if (proto && Object.getPrototypeOf(proto) === null) { 
    // plain object 
} 

+0

* sidenote: * न्यूनतम ब्राउज़र संस्करण आवश्यकताएं: फ़ायरफ़ॉक्स 3.5, क्रोम 5, आईई 9. देखें: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor