Crockford, iyi JavaScript tekniklerini popülerleştirmek için çok şey yaptı. Dilin kilit unsurları konusundaki görüşlü tutumu birçok yararlı tartışmaya yol açtı. Bununla birlikte, her bir "kötü" veya "zararlı" bildirisini müjde olarak alan ve bir adamın görüşünün ötesine bakmayı reddeden çok fazla insan var. Bazen biraz sinir bozucu olabilir.
new
Anahtar kelime tarafından sağlanan işlevselliğin kullanımının, her bir nesneyi sıfırdan oluşturmanın birkaç avantajı vardır:
- Prototip mirası . Sınıf tabanlı OO dillerine alışkın olanlar tarafından sık sık şüphe ve alay konusu ele alınsa da, JavaScript'in yerel miras tekniği basit ve şaşırtıcı derecede etkili bir kod yeniden kullanımı aracıdır. Ve yeni anahtar kelime, kanonik (ve yalnızca mevcut platformlar arası) onu kullanma yöntemidir.
- Verim. Bu # 1 bir yan etkisidir: Ben oluşturmak her nesneye 10 yöntemleri eklemek istiyorsanız, ben olabilir sadece manuel her yeni nesneye her yöntemi atar bir yaratılış fonksiyon yazmak ... Ya ben onları atayabilirsiniz oluşturma işlevlerini
prototype
ve new
yeni nesneleri damgalamak için kullanın . Bu sadece daha hızlı olmakla kalmaz (prototip üzerindeki her bir yöntem için kod gerekmez), her bir nesne için her nesnenin ayrı özelliklerle balonlanmasını önler. Daha yavaş makinelerde (veya özellikle daha yavaş JS tercümanlarında) çok sayıda nesne oluşturulduğunda bu, zaman ve bellekte önemli bir tasarruf anlamına gelebilir.
Ve evet, new
diğer cevaplar tarafından açıkça tanımlanan bir önemli dezavantajı var: Kullanmayı unutursanız, kodunuz uyarı vermeden kırılacaktır. Neyse ki, bu dezavantaj kolayca hafifletilebilir - sadece işlevin kendisine biraz kod ekleyin:
function foo()
{
// if user accidentally omits the new keyword, this will
// silently correct the problem...
if ( !(this instanceof foo) )
return new foo();
// constructor logic follows...
}
Artık new
yanlışlıkla yanlış kullanımdan kaynaklanan sorunlar hakkında endişelenmenize gerek kalmadan avantajlara sahip olabilirsiniz. Hatta bozuk kod düşüncesinin sessizce sizi rahatsız edip etmediğini kontrol etmek için bir iddia da ekleyebilirsiniz. Veya bazılarının yorumladığı gibi, bir çalışma zamanı istisnası tanıtmak için bu denetimi kullanın:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(Bu snippet'in, yapıcı işlev adının sabit kodlanmasını önleyebileceğini unutmayın; önceki örnekten farklı olarak, nesneyi gerçekten başlatmaya gerek yoktur - bu nedenle, değişiklik yapılmadan her hedef işleve kopyalanabilir.)
John Resig, basit "Sınıf" Örnekleme gönderisinde bu teknikle ilgili ayrıntılara girer ve varsayılan olarak bu davranışı "sınıflarınıza" dahil etmenin bir yolunu da içerir. Kesinlikle bir oku ... onun yaklaşan kitap, olduğu gibi JavaScript Ninja Sırları Bu ve diğer pek çok "zararlı" altın gizlenmiş bulduğu, JavaScript dili özellikleri ( bölüm üzerinde with
özellikle bizler için aydınlatmaktır başlangıçta görevden kim hile olarak bu çok kötü huylu özellik).