Crockford telah melakukan banyak hal untuk mempopulerkan teknik JavaScript yang baik. Pendiriannya yang tegas tentang unsur-unsur utama bahasa telah memicu banyak diskusi bermanfaat. Yang mengatakan, ada terlalu banyak orang yang menganggap setiap proklamasi "buruk" atau "berbahaya" sebagai Injil, menolak untuk melihat melampaui pendapat satu orang. Kadang-kadang bisa sedikit frustasi.
Penggunaan fungsi yang disediakan oleh new
kata kunci memiliki beberapa keunggulan dibandingkan membangun setiap objek dari awal:
- Warisan prototipe . Meskipun sering dipandang dengan campuran kecurigaan dan cemoohan oleh mereka yang terbiasa dengan bahasa OO berbasis kelas, teknik pewarisan asli JavaScript adalah cara sederhana dan mengejutkan yang efektif untuk menggunakan kembali kode. Dan kata kunci baru adalah sarana kanonik (dan hanya lintas platform yang tersedia) untuk menggunakannya.
- Performa. Ini adalah efek samping dari # 1: jika saya ingin menambahkan 10 metode ke setiap objek yang saya buat, saya hanya bisa menulis fungsi pembuatan yang secara manual menetapkan setiap metode ke setiap objek baru ... Atau, saya bisa menetapkannya ke fungsi penciptaan
prototype
dan digunakan new
untuk membasmi objek baru. Tidak hanya ini lebih cepat (tidak ada kode yang diperlukan untuk masing-masing dan setiap metode pada prototipe), itu menghindari membengkak setiap objek dengan properti terpisah untuk setiap metode. Pada mesin yang lebih lambat (atau terutama, lebih lambat JS interpreter) ketika banyak objek sedang dibuat ini dapat berarti penghematan yang signifikan dalam waktu dan memori.
Dan ya, new
memiliki satu kelemahan penting, dengan cakap dijelaskan oleh jawaban lain: jika Anda lupa menggunakannya, kode Anda akan rusak tanpa peringatan. Untungnya, kerugian itu mudah dikurangi - cukup tambahkan sedikit kode ke fungsi itu sendiri:
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...
}
Sekarang Anda dapat memiliki keuntungan new
tanpa harus khawatir tentang masalah yang disebabkan oleh penyalahgunaan yang tidak disengaja. Anda bahkan bisa menambahkan pernyataan ke cek jika pikiran kode yang rusak diam-diam mengganggu Anda. Atau, seperti dikomentari beberapa orang , gunakan tanda centang untuk memperkenalkan pengecualian runtime:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(Perhatikan bahwa cuplikan ini dapat menghindari pengkodean nama fungsi konstruktor, karena tidak seperti contoh sebelumnya ia tidak perlu benar-benar instantiate objek - oleh karena itu, ia dapat disalin ke setiap fungsi target tanpa modifikasi.)
John Resig merinci teknik ini di pos Instansiasi "Kelas" -nya yang Sederhana , serta memasukkan cara untuk membangun perilaku ini ke dalam "kelas" Anda secara default. Pasti layak dibaca ... seperti buku terbarunya, Rahasia Ninja JavaScript , yang menemukan tersembunyi emas dalam hal ini dan banyak lainnya "berbahaya" fitur bahasa JavaScript (yang bab tentang with
terutama mencerahkan bagi kita yang awalnya diberhentikan fitur yang banyak difitnah ini sebagai gimmick).