2016-09-28 5 views
39

"जावास्क्रिप्ट क्लोन वस्तु" के लिए Googling वास्तव में कुछ अजीब परिणाम है, उनमें से कुछ बुरी पुराने हो गए हैं और कुछ अभी भी जटिल हैं लाता है, यह बस के रूप में के रूप में आसान नहीं है ?क्या यह ES6 में किसी ऑब्जेक्ट को क्लोन करने का एक अच्छा तरीका है?</p> <pre><code>let clone = {...original}; </code></pre> <p>क्या इस के साथ गलत है:

+0

आपका उदाहरण वैध जावास्क्रिप्ट मान्य नहीं है। –

+0

यह कानूनी ES6 नहीं है। लेकिन अगर यह पहनता है, यह क्लोन नहीं है: आपके क्लोन और मूल गुण दोनों अब एक ही चीजों को इंगित करते हैं। उदाहरण के लिए, 'मूल = {ए: [1,2,3]}' आपको 'clone.a' के साथ एक क्लोन देता है जिसका शाब्दिक रूप से' original.a' होता है। या तो 'clone' या' original' को संशोधित करता है * एक ही बात * के माध्यम से संशोधन, इसलिए कोई, यह बुरा है =) –

+0

@AlbertoRivera यह * थोड़े * मान्य JavaScript, में है कि यह एक [चरण 2] है (https है: // GitHub। com/sebmarkbage/ecmascript-rest-spread) प्रस्ताव जो जावास्क्रिप्ट मानक के लिए भविष्य के अतिरिक्त होने की संभावना है। – Frxstrem

उत्तर

47

पूरी तरह से स्वीकार्य है, और भी बहुत अब कि object spread is stage 3 से क्लोन कर सकते हैं। जटिल चीजों पर लोग।

const clone = {...original} क्लोन करने के लिए

const newobj = {...original, prop: newOne} अपरिवर्तनीय एक नई वस्तु के रूप में मूल और दुकान के लिए एक और प्रोप जोड़ने के लिए।

36

Object.assign का प्रयोग करें।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

var obj = { a: 1 }; 
var copy = Object.assign({}, obj); 
console.log(copy); // { a: 1 } 

बहरहाल, यह एक गहरी क्लोन नहीं होगा। अभी तक गहरे क्लोनिंग का कोई मूल तरीका नहीं है।

संपादित करें: @Mike 'Pomax' Kamermans टिप्पणी में उल्लेख किया है, आप गहरी सरल वस्तुओं क्लोन कर सकते हैं JSON.parse(JSON.stringify(input))

+8

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

+0

@ माइक'पोमैक्स 'कामरमैन यह सच है। getters और setters के लिए कार्यक्षमता खो भयानक है, हालांकि ... –

+0

आप गहरी क्लोन करने के लिए एक सामान्य समारोह किसी भी वस्तु की जरूरत है, बाहर http://stackoverflow.com/a/13333781/560114 की जाँच करें। –

0

आप केवल का उपयोग करना चाहिए ... (प्रसार का उपयोग कर (यानी कोई प्रोटोटाइप, कार्य या वृत्तीय संदर्भ।)) पुनरावृत्तियों पर, गैर iterables पर फैलाने या किसी ऑब्जेक्ट शाब्दिक के अंदर एक त्रुटि फेंक देगा। पिछला जवाब समाधान है। तुम भी एक से अधिक वस्तु

let obj1 = { firstDay: 'monday' } 
let obj2 = { secondDay: 'tuesday' } 
let obj3 = { thirdDay: 'thirdDay' } 

let clone = Object.assign({},obj1,obj2,obj3) 
console.log(clone) 
// { firstDay: 'monday', 
// secondDay: 'tuesday', 
// thirdDay: 'thirdDay' } 
0

आप JSON.parse (JSON.stringify (वस्तु)) का उपयोग करने के रिकर्सिवली मुख्य मान प्रतियां बना सकते हैं नहीं करना चाहते हैं:

function copy(item){ 
    let result = null; 
    if(!item) return result; 
    if(Array.isArray(item)){ 
    result = []; 
    item.forEach(element=>{ 
     result.push(copy(element)); 
    }); 
    } 
    else if(item instanceof Object && !(item instanceof Function)){ 
    result = {}; 
    for(let key in item){ 
     if(key){ 
     result[key] = copy(item[key]); 
     } 
    } 
    } 
    return result || item; 
} 

लेकिन सबसे अच्छा तरीका है एक वर्ग बनाने के लिए जो कर सकते हैं इसका एक क्लोन स्वयं

class MyClass{ 
    data = null; 
    constructor(values){ this.data = values } 
    toString(){ console.log("MyClass: "+this.data.toString(;) } 
    remove(id){ this.data = data.filter(d=>d.id!==id) } 
    clone(){ return new MyClass(this.data) } 
} 
संबंधित मुद्दे