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
cevap
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.
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))
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. –
@ Mike'Pomax'Kamermans Bu doğru. Ancak, alıcılar ve ayarlayıcılar için işlevselliği kaybetmek korkunç ... –
Herhangi bir nesneyi derin klonlamak için genel bir işlev gerekiyorsa, http://stackoverflow.com/a/13333781/560114 adresini ziyaret edin. –
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' }
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) }
}
- 1. Git, <<<<<<< HEAD dosyasına
- 2. Referans 'bu' bir <a> etiketi
- 3. <script><!--//--></script> Modern bir amacı var mı?
- 4. Bu komut dosyası etiketi nedir?</p> <pre><code><script src="{{ file.name_js }}"></script> </code></pre> <p>bu mu daha iyi:
- 5. Değişken adından sonra 2 virgül, bash'ta ne demektir?</p> <pre><code>${reportName,,} </code></pre> <p>Ben googling tarafından bir şey bulamadı, bu yüzden herkes bu ne biliyor ,, demek:
- 6. dönüştürme <IMG> Bu</p> <pre><code><img id='my_img' src='www.someimage.com'> </code></pre> <p>gibi bir görüntü var Javascript
- 7. Bu kod neden gölgelendirme `let` bindings askıda kalıyor? yorumlayıcı</p> <pre><code>j = let x = 4 in let x = x * x in x </code></pre> <p>:
- 8. <span> içinde <span> var mı?
- 9. Benim kodunda bu var bir <%= for %> görünüm yardımcı
- 10. angularjs - ReferenceError: Bu</p> <p><code>var fbcanvas = $('#fbcanvas');</code></p> <p>yapmaya çalıştıklarında $ Bu Bu benim JS olduğunu ben</p> <blockquote> <p>ReferenceError: $ is not defined</p> </blockquote> <p>var hatadır
- 11. Thymeleaf'ın JSP etiketleri gibi bir şeyleri var mı?</p> <p><strong><em>ChildPage.jsp</em></strong>:
- 12. Pandalar: Subindexing dataframes: bu unsurların bir kopyasını</p> <pre><code>bar = foo.iloc[3:5,1:4] </code></pre> <p><code>bar</code> yapar tutun: görünümleri
- 13. Javascript'te düz bir nesneyi boşaltmanın en etkili yolu nedir?</p> <pre><code>array.length = 0; </code></pre> <p>düz nesneler için aynı işlem çalışıyor mu:
- 14. türden bir koleksiyon almak mümkün mü? bu birliği oluşturan türlerinin bir koleksiyon çıkarmak için bir yöntem var mı</p> <pre><code>SomeUnion = Union{Int, String} </code></pre> <p>:
- 15. P (a <= X <= b) değerini görüntülemek için expression() yöntemini almanın bir yolu var mı?
- 16. Bu hangi dilde? (<%REPEAT...%>, <% İSTEĞE ...%>)
- 17. Nasıl bu kod var <string>
- 18. Sözlük <> bir IEnumerable <> kaynağı ile doldurma</ a0><a1></ a1>
- 19. Boş bir dizenin JavaScript'deki boş bir dizeye eşit olmadığı zamanlar var mı? <code>'' === '' ? null : ('' === '*' ? '*' : ('').split(','));</code></p> <p>hiç <code>'' === ''</code> doğru değil olduğu bir zaman var mı:
- 20. strcpy'nin bir <code>char *</code><code>String</code> adı sahip yanlış formu
- 21. REGEX: <code><%=anything%><%=anything%></code></p> <p>ve normal bir ifade: <code><%=\\s*(\\S+)\\s*%></code> bu açıklama ı bildirimde bulunmamış REGEX
- 22. Paylaşılan_ptr <void>'u paylaşılan_ptr <T>'a yayınlamanın bir yolu var mı?
- 23. Ben bu adreste koyulabileceği bir <code>html</code> dosyası var css dosyasını
- 24. Bu bağlamda groovy << operatörü ne demektir?
- 25. nasıl WPF bir <code>BitmapImage</code> nesne için bir <code>WriteableBitmap</code> nesneyi dönüştürmek nasıl WPF
- 26. Listedeki bir çiftin her iki öğesinin bir işlevini liste anlamadan daha iyi bir yolu var mı? Bunu yapmak için daha iyi bir yolu</p> <pre><code>a' = [ (f x, f y) | (x, y) <- a ] </code></pre> <p>var mı:
- 27. Bu operatörler Elixir'de ne anlama geliyor? ~ >>, << ~
- 28. bu soru <p></p> kapalıdır
- 29. Java, bitshifts kullanırken, neden 1 << 32! = 1 << 31 << 1?
- 30. Şu izle ifadem tutan bana gösteriyor Şu anda bir</p> <pre><code>Expression<Func<T,bool>> </code></pre> <p>bir</p> <pre><code>Expression<Func<T,object>> </code></pre> <p>dönüştürmek çalışıyorum
Örneğiniz bu arada geçerli bir javascript değildir. –
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ü =) –
@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