Praktik terbaik JavaScript, memperluas versi asli dengan *statika*

Beberapa orang akan memberi tahu Anda bahwa menambahkan prototipe ke JavaScript asli adalah tindakan yang jahat. Misalnya:

String.prototype.format = function(format, replacements) {
    ...
};

Sekarang, bagi mereka yang setuju dengan hal tersebut (jika tidak, jangan balas dengan jawaban, pendapat Anda N/A; ini bukan diskusi tentang prototipe), menambahkan metode statis ke metode asli sama seperti kejahatan? (Sampai saat ini, "statis" hanya berarti sebuah metode yang konteksnya bukan sebuah contoh.)

Misalnya, mengingat bahwa membuat String.prototype.format adalah hal yang buruk, apakah menambahkannya sebagai statis merupakan praktik yang dapat diterima?

String.format = function(format, replacements) {
    ...
};

Apa bedanya memperluas native dengan metode statis, dalam hal praktik terbaik, dibandingkan memperluas native dengan prototipe? Entah Anda menentang perluasan native dengan cara apa pun, atau Anda tidak ada orang di kamp yang berpendapat bahwa ekstensi statis dapat diterima sedangkan prototypal tidak?


person user979672    schedule 26.10.2011    source sumber
comment
Salah satu alasan utamanya sama dengan memperluas prototipe: Anda memperluas objek orang lain. Dalam proyek besar dan berjalan lama dengan banyak orang (yang selalu berubah), Anda biasanya ingin menghindari hal itu dan menggunakan antarmuka yang jelas antara kode orang (atau tim) yang berbeda. Karena jika tidak, kamu akan berakhir di api penyucian, jika tidak langsung masuk neraka :) Semua alasan lain yang biasanya diberikan orang, seperti mungkin ada fungsi dengan nama itu di masa mendatang, memang benar, tetapi jika dibandingkan dengan di atas dapat diabaikan - seperti yang akan Anda ketahui jika Anda pernah mengerjakan proyek sebesar itu. Jadi...   -  person Mörre    schedule 26.10.2011
comment
...meskipun ada beberapa jawaban teknis, yang paling penting (dari sudut pandang industri, programmer jQuery proyek kecil individu tidak akan terlalu peduli) adalah jawaban dari orang-orang dan manajemen. Jika Anda tidak peduli dengan aspek itu, Anda terbuka untuk lebih banyak variasi jawaban valid.   -  person Mörre    schedule 26.10.2011


Jawaban (2)


Tanyakan pada diri Anda mengapa memperluas penduduk asli itu jahat.

Alasan umum adalah

  • Bukan bukti masa depan, bagaimana jika standar mengatakan "Akan ada String.format"
  • Bukan bukti masa lalu, menambahkan properti enumerable ke prototipe akan memecahkan kode yang buruk.
  • dapat menyebabkan kebingungan mengenai apa yang umum dan apa yang standar
  • mungkin merusak kode buruk (mengetik bebek, terlihat seperti bebek, gemetar seperti --- melempar pengecualian :()

Ini hanyalah masalah mempertimbangkan seberapa besar Anda menghargai alasan tersebut. Saya hanya peduli pada #1 (pemeriksaan masa depan).

person Raynos    schedule 26.10.2011

Menambahkan metode statis ke Konstruktor asli kemungkinan besar tidak akan menimbulkan dampak yang tidak terduga pada kode orang lain atau waktu yang diperlukan untuk membuat objek menggunakan Konstruktor tersebut.

Namun, saat Anda menambahkan metode prototipe ke Konstruktor asli, setiap instance (bahkan instance yang dibuat untuk melakukan operasi seperti "test".indexOf("t")) akan memiliki overhead tambahan dari metode Anda. Mengulangi properti objek atau kemampuan pengujian (karena kita sering kali tidak dapat menilai objek berdasarkan jenisnya) menjadi lebih sulit.

Katakanlah Anda menambahkan String.prototype.forEach dalam kode Anda. Itu akan bocor ke setiap modul. Sekarang ketika beberapa kode lain menguji metode forEach (menganggapnya sebagai array di browser modern), mereka akan mendapatkan string--jahat.

person AutoSponge    schedule 26.10.2011
comment
Mengapa naik 2 poin? Telah dijelaskan dengan sangat jelas bahwa masalah prototipe sudah diketahui! - person Mörre; 26.10.2011