JavaScript: `yeni` değil kullanmak için Nasıl İyi bir Parça -
Crockford adlı kitabıJavaScript: İyi Parçaları, yapıcı işlevlerini gerektiğini söylüyor (sayfa 114)her zamanilk harfi (yani. isimleri verilecek Noktası), bu işlev adları ilk büyük harfle yazılması gerekirsadecekurucu fonksiyonlar (her şey küçük olmalı) ile kullanılabilir.
Bu Kongre bize yapıcı fonksiyonları ile new
operator unutmadan önlemek yardımcı olur.
O söylemeye devam ediyor"[a]n daha iyi strateji başa çıkma new
kullanmak için değil."
Benim soru, nasıl new
kullanmadan JavaScript program mı?
new Object()
ve edebi ilenew Array()
{}
[]
engelleyebiliriz.new Number()
,new Boolean()
0
,true
''
new String()
engelleyebiliriz./pattern/
gibi bir şeynew RegExp()
engelleyebiliriz.
Nasıl new Date()
kaçınırız.
Ve en önemlisi, nasıl kendi özel Nesneleri ile new
kullanmaktan kaçının muyuz?
CEVAP
Crockford, Javascript yaptığı görüşmeler http://developer.yahoo.com/yui/theater/ üzerinde mevcut bulunan JS tarafından sağlanan olması gerektiği gibi nesne oluşturma bir fonksiyon için bir örnek kendisi verir
Ancak, YUİ(3) takım kendisi kullanır "yeni" ve BUNU takip tavsiyelerini (beri o Yahoo şef JS mimar (GÜNCELLEME: taşındı, ama bir açıklamaydı doğru zaman bu cevaptı aslında yazılı). "Akademik" düzeyde, olması GEREKEN dil tasarladığı "sağ" ve artıkları ile sınıf tabanlı kalıtım şeyler. bir daha bu beyanat, anlıyorum O (haklı olarak IMHO) JS çıktı bu şekilde çelişkili olduğunu söylüyor, prototip tabanlı ama "klasik sınıf" dil miras. bu tek bir şey ile
Ancak, JS ve kullanımı çok olduğu gibi"". yeni
Nesne oluşturma fonksiyonlarını burada bulabilirsiniz: http://javascript.crockford.com/prototypal.html
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);
EDİT: bu fonksiyonu Crockford en son sürümü kullanmak için Güncellendi - üç vardır.
GÜNCELLEMEHaziran 2015: tüm mevcut desteği (dahil. hangi tarayıcıları artık uzunca bir süre için Object.create(...)
oldu Ve üzeri 9) YANİ, bu yüzden Crockford fonksiyonu kullanmak için ihtiyacı vardı.
Ancakeğer Object.create
kullanırsanız çok bunu yapmaz emin olmalısınız çıkıyor: Bu fonksiyonu new Constructor()
! kullanarak daha ÇOK yavaştır
Bir açıklama (V8 motoru için) http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html bakın, ve performans bir demo için http://jsperf.com/object-create-vs-crockford-vs-jorge-vs-constructor/62 bkz.
Başka bir sebep için değil, arkanı new Constructor(...)
ES6 classes mutlaka bakın geniş kapsamlı evlatlık bile sadece basit bir nedenle en Javascript geliştiricileri gel sınıf tabanlı bir dil.
Ayrıca savunan bu makalede dışarı kontrol ediniçinObject.create
: http://davidwalsh.name/javascript-objects-deconstruction
Gibi ya da değil, özellikle projeler, paylaşmak istediğiniz bir geniş insanlar (Uzay ve zaman (yani doğru ya da ne zaman, diğer insanların üzerinden alarak mı) başka nedenlerle kullanma new
.
GÜNCELLEMEEylül 2015: kendim İçin, her şey için ES 2015 Javascript - ya io.js ve/veya Babil kullanarak kullanmaya başladım. Ben de kullanmak istemiyorumherhangi birProjelerim Javascript hariç new
ankastre new Error(...)
gibi. Çok daha güçlü işlevsel yaklaşım kullanmayı tercih ederim, tamamen nesne sistemi görmezden. [my-object].prototype
this
tamamen benim projelerden gitti. Uzun zamandır bu fikir ÇOK şüpheliydim nesneleri sadece iyi çalışır çünkü"". Ama çok isteksizce (io.js yeni bir proje başlangıcında bunu bir denemek sonra "" ve iki yıl harcadım. neden anlamıyorum tıkladım Tamam, tam olarak değil, bugün JS motorları ve donanımı çok daha stil için elverişli. Özellikle ES 2015, tavsiye veren bir fonksiyonel tarzı tamamen ücretsiz this
class
(yeni ES 2015 anahtar kelime veya bütün kavram, dayandığı kullanarak constructorFn.prototype
) bir deneyin. Sen "bir daha oraya gitmeyeceksin söz ver - gönüllü olarak. tıkladığında ancak birkaç hafta sürebilir Çok daha kullanışlı ve güçlü.
Eclipse'de yeni bir proje Maven Java 1...
Nasıl Javascript bir değişkeni kullanm...
Nasıl'In twitter bootstrap 2.1.0 ...
Nasıl bir Jquery fonksiyonu (yeni bir ...
Nasıl Javascript Çağırmak İçin Bir Bağ...