2011-12-29 11 views
8

मैं इस बारे में उत्सुक हूं कि उपयोगकर्ता द्वारा निर्धारित ऑब्जेक्ट के साथ Array.isArray() नकली करने का कोई तरीका है या नहीं।क्या आप उपयोगकर्ता द्वारा परिभाषित ऑब्जेक्ट के साथ Array.isArray() को नकली कर सकते हैं?

किताब से जावास्क्रिप्ट पैटर्न:

Array.isArray([]); // true 

// trying to fool the check 
// with an array-like object 
Array.isArray({ 
    length: 1, 
    "0": 1, 
    slice: function() {} 
}); // false 

कि स्पष्ट रूप से आपत्ति विफल रहता है, लेकिन वहाँ यह करने के लिए किसी भी अन्य तरीका है? यह बेहद जिज्ञासा है, और इसलिए नहीं क्योंकि मुझे लगता है कि आप कभी भी नियमित क्लाइंट कोड में .isArray() के साथ स्क्रू कर सकते हैं (हालांकि यह स्पष्ट रूप से यह जानकर शानदार होगा कि आप क्या कर सकते हैं!)।

उत्तर

9

केवल तभी यदि आप internal [[Class]] property से "Array" पर सेट करते हैं, जो संभव नहीं है। specification से:

isArray समारोह एक तर्क arg लेता है, और बूलियन मान true लौटाता है यदि तर्क एक वस्तु जिसका वर्ग आंतरिक संपत्ति "सरणी" है, अन्यथा यह false देता है।

या आप दूसरी तरफ जाते हैं: एक सामान्य सरणी बनाएं और प्रत्येक सरणी विधि को undefined पर स्पष्ट रूप से सेट करें।

+0

अब तुम मुझे के लिए प्रेरित किया गया है एक अनुवर्ती पर सवाल पूछने के लिए: http://stackoverflow.com/questions/8672204/can- आप-सेट-द-इंटर-क्लास-प्रॉपर्टी-ऑफ-ए-एस्मास्क्रिप्ट-ऑब्जेक्ट –

10

Array.isArray = function() { return true; }

और तुम शरारती होना चाहते हैं

Array.isArray.toString = function() { 
    return 'function() { [native code] }'; 
}; 
+0

दोनों समाधान काफी शरारती हैं। यह एक वैश्विक परिवर्तन है जो साइट/ऐप के अन्य हिस्सों को तोड़ सकता है। –

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