2015-09-07 20 views
6

MDN, .setPrototypeOf() kullanmanın kodunuzun gelecekteki performansı üzerinde olumsuz bir etkisi olacağını belirtti.setPrototypeOf'un performans etkisinin yeni bir Nesne üzerindeki etkisi nedir?

Ayrıca bir nesnenin [[Prototip]] 'inin değiştirilmesinin neden performansı düşüreceğiyle ilgili birkaç Soru okurum. Ancak cevapların hiçbiri arka planda neler olup bittiğini açıklamadı. Bu yüzden yeni Nesneler için de geçerli olup olmadığını merak ediyorum.

Özellikle Gerçekten bu gibi şeyler yapmak istiyorum: o değişmezi düz bir nesne kabul etmez çünkü

var MyPrototype = { 
    method1 : function(){...}, 
    method2 : function(){...}, 
    ... 
}; 

var newObject = Object.setPrototypeOf({ 
    property : 1, 
    property2 : 'text'     
}, MyPrototype); 

Maalesef Object.create ile bunu yapamaz.

setPrototypeOf kullanımım, yürütme JS motorunun performansını da azaltır mı?

+0

var NewObject = Object.create (MyPrototype, { "özellik1": {değeri: 1}, "özellik2": {değeri: text '}}); – Data

+1

Bunu biliyorum ama sanırım Object.create() 'özellikleri nesnesi çoğu durumda çok ağır. Her zamanki nesneyi yazmayı tercih ederim. 'Value' özelliği ile ek alt nesneler olmadan çok fazla karmaşıklığı önleyebilirsiniz. – Jovan

+0

Yani, [Neden performans için kötü bir nesnenin * \ [\ prototype \] \] * öğesini mutasyona uğratıyorsunuz?] (Http://stackoverflow.com/q/23807805/1048572)? – Bergi

cevap

5

Eğer korkuyorsanız (görünüşte gibi .. gerekir) Object.setPrototypeOf() kullanmanın performans etkisi ancak kod yapılandırılmış ayrılmasına benzer nesne oluşturma sözdizimi tutmak istiyorum, şunu deneyin:

var MyPrototype = { 
    method1 : function(){...}, 
    method2 : function(){...}, 
    ... 
}; 

var newObject = Object.assign(Object.create(MyPrototype), { 
    property : 1, 
    property2 : 'text'     
}); 
+0

Oh Görüyorum. Hmm dikişler bunu kaçırmışım gibi. İlk önce iki yeni nesne yarattığımızdan beri biraz aptalca gözüküyor, biri istenen özelliklere sahip ama yanlış prototip ve herhangi bir özelliği olmayan ama doğru prototip. Sadece o zaman tüm özellikleri bir nesneden diğerine çöker. Ancak bu, gelecekteki performans sorunlarını önleyeceğinden, sanırım gitmek için iyi bir yol. Teşekkürler! – Jovan

+0

Doğru prototipine sahip bir nesneyi ve özellikleri kopyalamak için başka bir nesne oluşturursunuz. Sadece ikincisi "savurgan" dır, ancak normalde birden çok "adlandırılmış" değeri bir işleve aktarırsınız. Object.create 'aynı mekanizmayı kullanır – Amit

+0

evet bunu biliyorum. Demek istediğim, belirli bir prototiple yeni bir nesne yaratmak istiyoruz, ancak bunu başarmak için aslında iki tane yaratmamız gerekiyor. Bu yöntemi, yöntem argümanları için de kullanıyorum, ancak burada gerçekten sadece doğru bir prototip ile yeni bir nesneyi hızla kurmak istiyoruz. Ama bu gitmek için daha iyi bir yoldur, bu yüzden hiçbir şikayetler ^^ – Jovan

0

Diğer bir seçenek Bu, sizin arzunuz olmasa da, nesneyi myPrototype sığ bir kopyasıyla birleştirmektir.

var MyPrototype = { 
    method1 : function(){}, 
    method2 : function(){} 
}; 

var newObject = Object.assign({ 
    property : 1, 
    property2 : 'text'     
}, MyPrototype); 
İlgili konular