2012-01-26 29 views
7

यह ऑब्जेक्ट्स के साथ बनाई गई Arrays की तरह दिखता है जैसे Arrays और Arrays की तरह quack, लेकिन अभी भी असली सरणी नहीं हैं। कम से कम v8/node.js. के साथऑब्जेक्ट.क्रेट के साथ बनाई गई जावास्क्रिप्ट Arrays - असली Arrays नहीं?

> a = [] 
[] 
> b = Object.create(Array.prototype) 
{} 
> a.constructor 
[Function: Array] 
> b.constructor 
[Function: Array] 
> a.__proto__ 
[] 
> b.__proto__ 
[] 
> a instanceof Array 
true 
> b instanceof Array 
true 
> Object.prototype.toString.call(a) 
'[object Array]' 
> Object.prototype.toString.call(b) 
'[object Object]' 

कुछ जावास्क्रिप्ट गुरु व्याख्या कर सकते हैं क्यों यह इतना है, और कैसे इतना है कि मेरी नवनिर्मित सरणी कोई वास्तविक सरणी से अप्रभेद्य है इसे बनाने के लिए?

मेरा लक्ष्य यहां डेटा संरचनाओं को क्लोन करना है, जिसमें एरेज़ शामिल हैं जिनमें कस्टम गुण संलग्न हो सकते हैं। मैं निश्चित रूप से Object.defineProperty का उपयोग कर नव निर्मित बनाए गए ऐरे में गुणों को मैन्युअल रूप से संलग्न कर सकता हूं, लेकिन Object.create का उपयोग करके ऐसा करने का कोई तरीका है?

+0

वे आपके लक्ष्य के लिए अलग-अलग हैं। पूरी तरह से indistingushable कैसे बनाने के लिए - 'बी = []' का उपयोग करें; – kirilloid

+0

@kirilloid - यह कुछ स्थितियों के लिए एक वैध दृष्टिकोण हो सकता है लेकिन ऐसी परिस्थितियों में जहां एक फैक्ट्री फ़ंक्शन आंतरिक रूप से प्रोटोटाइप पैराम के आधार पर नलसाजी करता है, तो आपका सुझाव एक विकल्प नहीं है। जैसे। एक मोनोइड के निर्माण में, इसके साथ शुरू करें: var monad = object.create (प्रोटोटाइप पैराम); यहां, यह सुविधाजनक होगा अगर प्रोटोटाइप पैराम Array.prototype – arcseldon

उत्तर

4

संक्षिप्त उत्तर नहीं है। This article यह सब कुछ विस्तार से समझाता है।

+0

बहुत ही रोचक हो सकता है! –

+0

देखें http://www.bennadel.com/blog/2292- विस्तार- जावास्क्रिप्ट- आराध्य- समय- पकाना- मूल- ब्रैकेट- नोटेशन- कार्यक्षमता के लिए कार्यक्षमता। एचटीएम। – Gili

3

नहीं, आप नहीं कर सकते। Object.create प्रोटोटाइप के बारे में सब कुछ है, लेकिन [] और Object.create(Array.prototype) दोनों एक ही प्रोटोटाइप ऑब्जेक्ट से प्राप्त होते हैं।

आप क्या कहते हैं "वांछित Object.prototype.toString व्यवहार" वस्तु है, जो Object.create साथ स्थापित करने के लिए असंभव है के आंतरिक [[Class]] है। "सच्चे सरणी" बनाना (Array वर्ग और special array behaviour - अनुक्रमित गुण, .length) केवल array literals या calling the Array constructor का उपयोग करके संभव है।

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