2016-09-28 6 views
39

bazı gerçekten garip sonuçlar, bazıları umutsuz eskimiş ve bazıları sadece çok karmaşıktır getiriyor, sadece kadar kolay değildir ?Bu, ES6'da bir nesneyi klonlamanın iyi bir yolu mu? Bu yanlış bir şey</p> <pre><code>let clone = {...original}; </code></pre> <p>var mı: "javascript klon nesnesi" Googling

+0

Örneğiniz bu arada geçerli bir javascript değildir. –

+0

bu yasal ES6 değildir. Ama olmasaydı, bu bir klon değil: hem klonunuz hem de orijinal özellikleriniz şimdi aynı şeylere işaret ediyor. Örneğin, 'orijinal = {a: [1,2,3]}' size 'clone.a' tam anlamıyla 'original.a' olan bir klon verir. 'Clone' veya 'original' ile yapılan değişiklik, * aynı şeyi değiştirir *, yani hayır, bu kötü =) –

+0

@AlbertoRivera Bu * kinda * geçerli bir JavaScript, yani bir [sahne 2] (https: // github. com/sebmarkbage/ecmascript-rest-spread) JavaScript standardına gelecekteki bir ekleme olması muhtemel olan teklif. – Frxstrem

cevap

47

Tamamen kabul edilebilir, hatta moreso şimdi bu object spread is stage 3 dan kopyalayabilirsiniz. İnsanlar fazla karmaşık şeyler yapar.

const clone = {...original}

const newobj = {...original, prop: newOne} immutably yeni bir nesne olarak özgün ve saklamak için bir pervane eklemek klonlanması için.

36

Object.assign kullanın. Ancak

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

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

, bu derin klon yapmaz. Henüz derin klonlamanın doğal yolu yok.

DÜZENLEME: @ Mike 'Po max' Kamermans açıklamalarda belirtildiği gibi, derin basit nesneleri klonlayabilirsiniz JSON.parse(JSON.stringify(input))

+8

Nesnenin gerçek bir nesne değişkeni ve salt veri olması koşuluyla bir tane var, bu durumda JSON.parse (JSON.stringify (input)) 'dır doğru bir derin klon. Bununla birlikte, prototiplerin, fonksiyonların veya dairesel referansların bulunduğu an, bu çözüm artık işe yaramaz. –

+0

@ Mike'Pomax'Kamermans Bu doğru. Ancak, alıcılar ve ayarlayıcılar için işlevselliği kaybetmek korkunç ... –

+0

Herhangi bir nesneyi derin klonlamak için genel bir işlev gerekiyorsa, http://stackoverflow.com/a/13333781/560114 adresini ziyaret edin. –

0

Yalnızca kullanmalısınız ... (yayılmasını kullanarak (yani hiçbir prototipler, fonksiyonları ya da dairesel referanslar.)) yinelenenlerin üzerinde, tekrarlanamayanların üzerine veya bir nesnenin içine yayılmış bir yayının kullanılması bir hata verecektir. Önceki cevap çözümdür. Ayrıca, birden fazla nesne

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

Eğer yinelemeli anahtar-değer kopyalarını oluşturabilir JSON.parse (JSON.stringify (nesne)) kullanmak istemiyorsanız: bir sınıf oluşturmak için

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; 
} 

Ama en iyi yolu can Bir klon kendi başına dön

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) } 
} 
İlgili konular