2012-04-25 8 views
12

मैंने पिछले 10 वर्षों में यहां 10 या 20 मिनट बिताए हैं और संभवत: एक दर्जन बार और इस प्रश्न के बुलेटप्रूफ जवाब को कभी नहीं मिला है।आप कैसे जांचते हैं कि कोई जावास्क्रिप्ट ऑब्जेक्ट सीधे `{}` उदाहरण है, उप-वर्ग नहीं है?

आप कैसे जांचते हैं कि जावास्क्रिप्ट ऑब्जेक्ट Object का उदाहरण है, उप-वर्ग नहीं है?

इसके लिए एक उपयोग केस यह जांचना है कि arguments[0] एक "विकल्प" हैश बनाम एक "मॉडल" (एमवीसी) है, जिसमें से दोनों मूल Object का विस्तार करते हैं, लेकिन इसका अलग-अलग व्यवहार किया जाना चाहिए।

मैं इन की कोशिश की है:

// some helper to get constructor name 
function klassName(fn) { 
    if (fn.__name__) { 
    return fn.__name__; 
    } 
    if (fn.name) { 
    return fn.name; 
    } 
    return fn.toString().match(/\W*function\s+([\w\$]+)\(/)); 
}; 

var Model = function() {}; 

m = new Model; 
o = {}; 

Object(o) === o; // true 
Object(m) === m; // true, thought it might be false 

klassName(o.constructor); // Object 
klassName(m.constructor); // Model 

klassName(m.constructor) कि कुछ मामलों में काम नहीं करता है (वास्तव में याद नहीं कर सकते, लेकिन शायद एक regex.constructor, ऐसा ही कुछ)। शायद यह करता है, निश्चित रूप से पता नहीं है।

क्या कोई बुलेटप्रूफ तरीका है यह बताने के लिए कि {} ऑब्जेक्ट है या नहीं?

+1

जावास्क्रिप्ट कुछ भी नहीं में बुलेटप्रूफ है। 'बुलेटप्रूफ' भी काम नहीं करता है। :) –

+1

बीटीडब्ल्यू - जावास्क्रिप्ट में ** subclass ** प्रति-सी नहीं है। केवल कन्स्ट्रक्टर फ़ंक्शन और प्रोटोटाइप। – gnarf

उत्तर

11

कर सकते हैं

function isObj(test) { 
    return test.constructor === Object; 
} 

के रूप में सरल कुछ रहो तुम्हारे लिए क्या देख रहे हैं?

Test in jsFiddle

+0

यह काम करता है। मैं बस अपने जवाब को अपडेट करने के समान कुछ कोशिश कर रहा था। यह काम करता है। क्या यह बुलेटप्रूफ है? – elclanrs

+0

@elclanrs - मैं आपके प्रत्येक लक्षित ब्राउज़र को जांचने के लिए [browserstack] (http://browserstack.com) का उपयोग करने का सुझाव देता हूं। – gnarf

+0

@elclanrs - अगर यह कहीं भी काम नहीं करता है, तो मैं देखूंगा कि मैं इसे उत्तर में भी प्राप्त कर सकता हूं। मैंने इसे आईई 6-9 और क्रोम, फ़ायरफ़ॉक्स, ओपेरा नवीनतम में परीक्षण किया। यह ज्यादातर मामलों के लिए काम करना चाहिए। – gnarf

1

आपका मतलब यह है? http://jsfiddle.net/elclanrs/ukEEw/

var o = {}; 
var re = /\d/; 
var f = function(){}; 
var d = new Date(); 

var isObj = function(e){ 
    return e.toString() === '[object Object]'; 
}; 

console.log(isObj(o)); // True 
console.log(isObj(re)); // False 
console.log(isObj(f)); // False 
console.log(isObj(d)); // False 

+0

बस 'obj.toString() ' – gnarf

+0

' isObj (नया मॉडल) के बजाय 'Object.prototype.toString.call (obj)' का उपयोग करने पर विचार करें; // सच' –

0

मैं सिर्फ एक बात बदल जाएगा

var isObj = function(e){ 
    if(!e) return false; // change this line 
    return e.toString() === '[object Object]'; 
}; 
संबंधित मुद्दे

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