2015-12-29 7 views
15

मैं सिर्फजे एस: Object.assign करता है() गहरी प्रतिलिपि या उथले प्रतिलिपि बनाने

var copy = Object.assign({}, originalObject); 

की इस अवधारणा जो "copy" वस्तु में मूल वस्तु एक कॉपी बन जाती बारे में जाना। हालांकि, मेरा सवाल यह है कि, क्लोनिंग ऑब्जेक्ट का यह तरीका गहरी प्रतिलिपि या उथली प्रतिलिपि बनाता है?

पीएस: भ्रम है, अगर यह एक गहरी प्रतिलिपि बनाता है, तो यह किसी ऑब्जेक्ट को क्लोन करने का सबसे आसान तरीका होगा।

+0

डॉक आत्म व्याख्यात्मक है मुझे लगता है कि: – Sebas

उत्तर

18

गहरी प्रतिलिपि के बारे में भूल जाओ, यहां तक ​​कि उथली प्रतिलिपि सुरक्षित नहीं है, अगर आप जिस ऑब्जेक्ट की प्रतिलिपि बना रहे हैं उसकी संपत्ति enumerable विशेषता है जो झूठी पर सेट है।

MDN:

Object.assign() विधि केवल प्रतियां गणनीय और खुद गुण लक्ष्य वस्तु

करने के लिए एक स्रोत ऑब्जेक्ट से इस उदाहरण लेते

var o = {}; 

Object.defineProperty(o,'x',{enumerable: false,value : 15}); 

var ob={}; 
Object.assign(ob,o); 

console.log(o.x); // 15 
console.log(ob.x); // undefined 
11

Object.assign() का उपयोग करके, आप वास्तव मेंकर रहे हैंअपनी ऑब्जेक्ट कीकॉपी करें। जब भी हम एक ऑब्जेक्ट को दूसरे ऑब्जेक्ट को असाइन करने की तरह ऑपरेशन करते हैं, तो हम वास्तव में एक उथली प्रतिलिपि करते हैं, यानी यदि ओबीजे 1 एक ऑब्जेक्ट है, तो इसे किसी अन्य ऑब्जेक्ट के माध्यम से संशोधित करना जो ओबीजे 2 ओबीजे 1 में भी बदलाव को प्रतिबिंबित करेगा।

+15

अगर "Object.assign() विधि लक्ष्य वस्तु के लिए एक या अधिक स्रोत वस्तुओं से सभी ** गणनीय खुद ** गुण के मूल्यों की प्रतिलिपि करने के लिए किया जाता है" यह केवल उथली प्रतिलिपि बनाता है, रेडक्स कैसे काम करता है? मैंने सोचा कि इसका पूरा बिंदु प्रेषित किए गए डेटा की एक गहरी प्रतिलिपि बनाना था ताकि यदि स्टोर के बाहर डेटा बदल दिया गया हो, तो यह स्टोर में जो भी हो, वह नहीं बदलेगा। अगर यह एक उथल-पुथल प्रतिलिपि थी, तो डेटा लिंक किया जाएगा, जो डेटा के साथ मुद्दों को बदलता है, बिना किसी प्रेषण के स्टोर में क्या बदलता है, सही? – stackjlei

+0

मैं रेडक्स में इसी समस्या में भाग गया और मैं JSON.parse (JSON.stringify()) पर जा रहा हूं। यदि ऑब्जेक्ट को किसी अन्य पैकेज द्वारा उत्परिवर्तित किया जाता है और रिकर्सिव समस्याएं उत्पन्न करता है तो इसमें भी समस्याएं होती हैं। मैं एक बेहतर विकल्प की तलाश में हूं। यह विधि अभी भी एक है जिसका मैं उपयोग कर रहा हूं। – Stu

3

यह this paragraph from MDN के अनुसार एक उथले कॉपी बन जाती है,:

गहरी क्लोनिंग के लिए, हम अन्य विकल्पों क्योंकि Object.assign() प्रतियां संपत्ति मूल्यों का उपयोग करने की जरूरत है। यदि स्रोत मान किसी ऑब्जेक्ट का संदर्भ है, तो यह केवल उस संदर्भ मान की प्रतिलिपि बनाता है।

रेडक्स के प्रयोजनों के लिए, Object.assign() पर्याप्त है क्योंकि रेडक्स ऐप की स्थिति में केवल अपरिवर्तनीय मान (JSON) होते हैं।

+4

क्या ऐप के रेडक्स राज्य में अन्य ऑब्जेक्ट्स के संदर्भ वाले ऑब्जेक्ट्स नहीं हो सका ..? –

0

छोटे Data structures के लिए मुझे लगता है कि JSON.stringify() और JSON.parse() अच्छा काम करते हैं।

// store as JSON 
var copyOfWindowLocation = JSON.stringify(window.location) 
console.log("JSON structure - copy:", copyOfWindowLocation) 
// convert back to Javascript Object 
copyOfWindowLocation = JSON.parse(copyOfWindowLocation) 
console.log("Javascript structure - copy:", copyOfWindowLocation) 
संबंधित मुद्दे