Pendekatan klasik (non-js) untuk overloading:
function myFunc(){
//code
}
function myFunc(overloaded){
//other code
}
Javascript tidak akan membiarkan lebih dari satu fungsi didefinisikan dengan nama yang sama. Karena itu, hal-hal seperti ini muncul:
function myFunc(options){
if(options["overloaded"]){
//code
}
}
Apakah ada solusi yang lebih baik untuk function overloading di javascript selain meneruskan objek dengan kelebihan beban di dalamnya?
Meneruskan kelebihan beban dapat dengan cepat menyebabkan fungsi menjadi terlalu bertele-tele karena setiap kemungkinan kelebihan beban akan membutuhkan pernyataan bersyarat. Menggunakan fungsi untuk menyelesaikan bagian //code
dalam pernyataan bersyarat tersebut dapat menyebabkan situasi rumit dengan cakupan.
javascript
Travis J
sumber
sumber
Jawaban:
Ada beberapa aspek untuk argumen overloading di Javascript:
Argumen variabel - Anda dapat meneruskan set argumen yang berbeda (baik dalam tipe maupun kuantitas) dan fungsi akan berperilaku sesuai dengan argumen yang diteruskan padanya.
Argumen default - Anda dapat menentukan nilai default untuk argumen jika tidak dilewatkan.
Argumen bernama - Urutan argumen menjadi tidak relevan dan Anda cukup memberi nama argumen yang ingin Anda teruskan ke fungsi tersebut.
Di bawah ini adalah bagian tentang masing-masing kategori penanganan argumen ini.
Argumen Variabel
Karena javascript tidak memiliki jenis pemeriksaan pada argumen atau jumlah argumen yang diperlukan, Anda hanya dapat memiliki satu implementasi
myFunc()
yang dapat menyesuaikan dengan argumen apa yang diteruskan kepadanya dengan memeriksa jenis, keberadaan, atau jumlah argumen.jQuery melakukan ini sepanjang waktu. Anda bisa membuat beberapa argumen opsional atau Anda bisa bercabang di fungsi Anda tergantung pada argumen apa yang diteruskan padanya.
Dalam mengimplementasikan jenis kelebihan beban ini, Anda memiliki beberapa teknik berbeda yang dapat Anda gunakan:
undefined
.arguments.length
.arguments
pseudo-array untuk mengakses argumen yang diberikan denganarguments[i]
.Berikut beberapa contohnya:
Mari kita lihat
obj.data()
metode jQuery . Ini mendukung empat bentuk penggunaan yang berbeda:Masing-masing memicu perilaku yang berbeda dan, tanpa menggunakan bentuk dinamis pemuatan berlebih ini, akan memerlukan empat fungsi terpisah.
Inilah cara seseorang dapat membedakan semua opsi ini dalam bahasa Inggris dan kemudian saya akan menggabungkan semuanya dalam kode:
Jika argumen pertama yang diteruskan ke
.data()
adalah string dan argumen kedua adalahundefined
, maka pemanggil harus menggunakan formulir ini.Jika argumen kedua tidak terdefinisi, maka setel nilai kunci tertentu.
Jika tidak ada argumen yang diberikan, kembalikan semua kunci / nilai dalam objek yang dikembalikan.
Jika tipe argumen pertama adalah objek biasa, maka setel semua kunci / nilai dari objek tersebut.
Inilah cara Anda dapat menggabungkan semua itu dalam satu set logika javascript:
Kunci dari teknik ini adalah untuk memastikan bahwa semua bentuk argumen yang ingin Anda terima dapat diidentifikasi secara unik dan tidak pernah ada kebingungan tentang bentuk mana yang digunakan penelepon. Ini biasanya memerlukan pengurutan argumen dengan tepat dan memastikan bahwa ada cukup keunikan dalam jenis dan posisi argumen sehingga Anda selalu dapat membedakan bentuk mana yang digunakan.
Misalnya, jika Anda memiliki fungsi yang membutuhkan tiga argumen string:
Anda bisa dengan mudah membuat argumen ketiga opsional dan Anda bisa dengan mudah mendeteksi kondisi itu, tapi Anda tidak bisa membuat hanya argumen kedua opsional karena Anda tidak bisa membedakan yang mana yang dimaksudkan pemanggil untuk diteruskan karena tidak ada cara untuk mengidentifikasi jika yang kedua. argumen dimaksudkan sebagai argumen kedua atau argumen kedua dihilangkan jadi apa yang ada di tempat argumen kedua sebenarnya adalah argumen ketiga:
Karena ketiga argumen memiliki tipe yang sama, Anda tidak dapat membedakan antara argumen yang berbeda sehingga Anda tidak tahu apa yang dimaksudkan oleh pemanggil. Dengan gaya pemanggilan ini, hanya argumen ketiga yang bisa menjadi opsional. Jika Anda ingin menghilangkan argumen kedua, argumen tersebut harus diteruskan sebagai
null
(atau beberapa nilai lain yang dapat dideteksi) dan kode Anda akan mendeteksi bahwa:Berikut adalah contoh jQuery dari argumen opsional. kedua argumen bersifat opsional dan menggunakan nilai default jika tidak diteruskan:
Berikut adalah contoh jQuery di mana argumennya bisa hilang atau salah satu dari tiga jenis berbeda yang memberi Anda empat kelebihan beban berbeda:
Argumen Bernama
Bahasa lain (seperti Python) memungkinkan seseorang untuk melewatkan argumen bernama sebagai sarana untuk meneruskan hanya beberapa argumen dan membuat argumen tidak tergantung pada urutan mereka diteruskan. Javascript tidak secara langsung mendukung fitur argumen bernama. Pola desain yang biasa digunakan untuk menggantikannya adalah meneruskan peta properti / nilai. Ini bisa dilakukan dengan melewatkan objek dengan properti dan nilai atau di ES6 dan di atasnya, Anda sebenarnya bisa meneruskan objek Map itu sendiri.
Berikut contoh ES5 sederhana:
jQuery
$.ajax()
menerima bentuk penggunaan di mana Anda hanya meneruskannya satu parameter yang merupakan objek Javascript biasa dengan properti dan nilai. Properti mana yang Anda teruskan menentukan argumen / opsi mana yang diteruskan ke panggilan ajax. Beberapa mungkin diperlukan, banyak yang opsional. Karena mereka adalah properti pada suatu objek, tidak ada urutan tertentu. Faktanya, ada lebih dari 30 properti berbeda yang dapat diteruskan pada objek itu, hanya satu (url) yang diperlukan.Berikut contohnya:
Di dalam
$.ajax()
implementasi, ia kemudian dapat menginterogasi properti mana yang diteruskan pada objek yang masuk dan menggunakannya sebagai argumen bernama. Ini bisa dilakukan denganfor (prop in obj)
atau dengan memasukkan semua properti ke dalam larik denganObject.keys(obj)
dan kemudian mengiterasi larik itu.Teknik ini sangat umum digunakan di Javascript ketika ada banyak argumen dan / atau banyak argumen bersifat opsional. Catatan: ini memberi tanggung jawab pada fungsi implementasi untuk memastikan bahwa ada sekumpulan argumen valid minimal dan untuk memberi pemanggil beberapa umpan balik debug apa yang hilang jika argumen yang diteruskan tidak mencukupi (mungkin dengan membuat pengecualian dengan pesan kesalahan yang membantu) .
Dalam lingkungan ES6, dimungkinkan untuk menggunakan destructuring untuk membuat properti / nilai default untuk objek yang diteruskan di atas. Ini dibahas lebih rinci dalam artikel referensi ini .
Inilah salah satu contoh dari artikel itu:
Ini membuat properti dan nilai default untuk
start
,end
danstep
properti pada objek yang diteruskan keselectEntries()
fungsi.Nilai default untuk argumen fungsi
Di ES6, Javascript menambahkan dukungan bahasa bawaan untuk nilai default untuk argumen.
Sebagai contoh:
Penjelasan lebih lanjut tentang cara ini dapat digunakan di sini di MDN .
sumber
resetProgressBar: function(display_errors, lockout = false)
.Membebani suatu fungsi di JavaScript dapat dilakukan dengan banyak cara. Semuanya melibatkan satu fungsi master yang melakukan semua proses, atau mendelegasikan ke sub-fungsi / proses.
Salah satu teknik sederhana yang paling umum melibatkan sakelar sederhana:
Teknik yang lebih elegan adalah menggunakan array (atau objek jika Anda tidak membuat kelebihan beban untuk setiap jumlah argumen):
Contoh sebelumnya tidak terlalu elegan, siapa pun dapat memodifikasi
fooArr
, dan akan gagal jika seseorang memberikan lebih dari 2 argumen kefoo
, jadi bentuk yang lebih baik adalah menggunakan pola modul dan beberapa pemeriksaan:Tentu saja kelebihan Anda mungkin ingin menggunakan sejumlah parameter dinamis, sehingga Anda dapat menggunakan objek untuk
fns
koleksi.Preferensi pribadi saya cenderung menjadi
switch
, meskipun itu meningkatkan fungsi utama. Contoh umum tempat saya menggunakan teknik ini adalah metode accessor / mutator:sumber
Anda tidak dapat melakukan overloading metode dalam arti yang sempit. Tidak seperti cara itu didukung
java
atauc#
.Masalahnya adalah JavaScript TIDAK secara native mendukung metode overloading. Jadi, jika ia melihat / mem-parsing dua atau lebih fungsi dengan nama yang sama, itu hanya akan mempertimbangkan fungsi yang ditentukan terakhir dan menimpa yang sebelumnya.
Salah satu cara yang menurut saya cocok untuk sebagian besar kasus adalah sebagai berikut -
Katakanlah Anda punya metode
Alih-alih metode overloading yang tidak mungkin dilakukan di javascript, Anda dapat menentukan metode baru
dan kemudian ubah fungsi pertama sebagai berikut -
Jika Anda memiliki banyak metode kelebihan beban, pertimbangkan untuk menggunakan lebih
switch
dari sekedarif-else
pernyataan.( lebih detail ) NB: Tautan di atas menuju ke blog pribadi saya yang memiliki detail tambahan tentang ini.
sumber
Saya menggunakan pendekatan overloading yang sedikit berbeda berdasarkan nomor argumen. Namun saya yakin pendekatan John Fawcett juga bagus. Berikut contoh, kode berdasarkan penjelasan John Resig (jQuery's Author).
kegunaan:
sumber
Dalam javascript Anda dapat mengimplementasikan fungsi hanya sekali dan menjalankan fungsi tanpa parameter
myFunc()
Anda kemudian memeriksa untuk melihat apakah opsi 'tidak ditentukan'sumber
Saya mencoba mengembangkan solusi elegan untuk masalah ini yang dijelaskan di sini . Dan Anda dapat menemukan demo di sini . Penggunaannya terlihat seperti ini:
Metode yang digunakan untuk mencapai ini:
sumber
https://github.com/jrf0110/leFunc
sumber
Tidak Ada Masalah dengan Overloading di JS, pb bagaimana cara menjaga kode yang bersih saat fungsi overloading?
Anda dapat menggunakan penerusan untuk memiliki kode yang bersih, berdasarkan dua hal:
Jenis argumen (saat memanggil fungsi)
sumber
Lihat ini:
http://www.codeproject.com/Articles/688869/Overloading-JavaScript-Functions
Pada dasarnya di kelas Anda, Anda memberi nomor pada fungsi Anda yang ingin kelebihan beban dan kemudian dengan satu panggilan fungsi Anda menambahkan fungsi kelebihan beban, cepat dan mudah.
sumber
Karena JavaScript tidak memiliki fungsi opsi kelebihan beban , objek dapat digunakan sebagai gantinya. Jika ada satu atau dua argumen yang diperlukan, lebih baik memisahkannya dari objek opsi. Berikut adalah contoh tentang cara menggunakan objek opsi dan nilai yang diisi ke nilai default jika nilai tidak diteruskan dalam objek opsi.
}
berikut adalah contoh bagaimana menggunakan objek opsi
sumber
Untuk ini, Anda perlu membuat fungsi yang menambahkan fungsi ke objek, kemudian akan dijalankan tergantung pada jumlah argumen yang Anda kirim ke fungsi:
sumber
Saya ingin menambahkan sub fungsi dalam fungsi induk untuk mencapai kemampuan membedakan antara grup argumen untuk fungsi yang sama.
sumber
Apa yang ingin Anda capai paling baik dilakukan dengan menggunakan variabel argumen lokal fungsi .
Anda dapat menemukan penjelasan yang lebih baik tentang cara kerjanya di sini .
sumber