Merak ettiğim halde yukarıdaki sorunun performans konusuna hala cevap bulamadığımdan, bu özü nodejs için sunulan (ve puanlanan) tüm çözümlerin hem performansını hem de güvenilirliğini test etmek için yazdım.
Bir klon işlevinin oluşturulmasıyla bir klonun çalıştırılmasının duvar zamanlarını karşılaştırdım. İddia hatalarıyla birlikte sonuçlar, esasın yorumuna dahil edilir.
Artı benim iki sentim (yazarın önerisine göre):
clone0 cent (daha hızlı ama daha çirkin):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (daha yavaş, ancak eval () 'dan hoşlanmayanlar için yalnızca kendileri ve ataları tarafından bilinen amaçlar için):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Performansa gelince, eval / new Function, sarmalayıcı çözümünden daha yavaşsa (ve gerçekten işlev gövdesi boyutuna bağlıysa), size çıplak işlev klonu verir (ve özellikleri olan ancak paylaşılmamış durumdaki gerçek sığ klonu) gereksiz tüyler olmadan gizli özellikler, sarmalayıcı işlevleri ve yığınla ilgili sorunlar.
Ayrıca, her zaman dikkate almanız gereken önemli bir faktör vardır: daha az kod, daha az hata yeri.
Eval / new İşlevini kullanmanın dezavantajı, klonun ve orijinal işlevin farklı kapsamlarda çalışacak olmasıdır. Kapsamlı değişkenler kullanan işlevlerle iyi çalışmaz. Bağlama benzeri sarma kullanan çözümler kapsamdan bağımsızdır.