Ketika membangun kelas di CoffeeScript, haruskah semua metode instance didefinisikan menggunakan =>
operator ("panah gemuk") dan semua metode statis didefinisikan menggunakan ->
operator?
coffeescript
arrow-functions
Ali Salehi
sumber
sumber
Jawaban:
Tidak, itu bukan aturan yang akan saya gunakan.
Kasus penggunaan utama yang saya temukan untuk panah-gemuk dalam mendefinisikan metode adalah ketika Anda ingin menggunakan metode sebagai panggilan balik dan metode itu merujuk bidang contoh:
Seperti yang Anda lihat, Anda mungkin mengalami masalah dalam meneruskan referensi ke metode instance sebagai panggilan balik jika Anda tidak menggunakan panah gemuk. Ini karena panah-lemak mengikat instance objek ke
this
sedangkan panah-tipis tidak, sehingga metode panah-tipis yang disebut sebagai callback seperti di atas tidak dapat mengakses bidang instance seperti@msg
atau memanggil metode instance lain. Baris terakhir ada solusi untuk kasus di mana panah tipis telah digunakan.sumber
this
yang akan dipanggil dari panah tipis, tetapi juga variabel instan yang akan Anda dapatkan dengan panah gemuk?this
diatur ke variabel yang ingin saya gunakan. Namun, saya juga ingin merujuk metode kelas, jadi saya inginthis
merujuk ke kelas juga. Saya hanya dapat memilih antara satu tugasthis
, jadi apa cara terbaik untuk dapat menggunakan kedua variabel?Suatu hal yang tidak disebutkan dalam jawaban lain yang penting untuk dicatat adalah bahwa fungsi pengikatan dengan panah gemuk ketika tidak perlu dapat menyebabkan hasil yang tidak diinginkan seperti dalam contoh ini dengan kelas kita hanya akan memanggil DummyClass.
Dalam hal ini fungsi melakukan persis apa yang diharapkan dan tampaknya tidak ada kerugian menggunakan panah gemuk, tetapi apa yang terjadi ketika kita memodifikasi prototipe DummyClass setelah itu sudah ditentukan (misalnya mengubah beberapa peringatan atau mengubah output dari log) :
Seperti yang dapat kita lihat, mengesampingkan fungsi prototipe kita yang telah didefinisikan sebelumnya menyebabkan some_function ditimpa dengan benar tetapi fungsi other_ tetap sama pada instance karena panah lemak telah menyebabkan fungsi_fungsi dari kelas terikat ke semua instance sehingga instance tidak akan merujuk kembali ke kelas mereka untuk menemukan fungsi
Bahkan panah gemuk tidak akan berfungsi sebagai panah gemuk hanya menyebabkan fungsi terikat ke instance baru (yang memang memperoleh fungsi baru seperti yang diharapkan).
Namun ini mengarah ke beberapa masalah, bagaimana jika kita membutuhkan fungsi (misalnya dalam kasus beralih fungsi logging ke kotak keluaran atau sesuatu) yang akan bekerja pada semua instance yang ada (termasuk event handler) [karena itu kita tidak dapat menggunakan panah gemuk dalam definisi asli] tetapi kita masih membutuhkan akses ke atribut internal dalam event handler [alasan tepatnya kami menggunakan panah gemuk bukan panah tipis].
Nah cara paling sederhana untuk mencapai ini adalah dengan hanya memasukkan dua fungsi dalam definisi kelas asli, satu didefinisikan dengan panah tipis yang melakukan operasi yang ingin Anda jalankan, dan yang lain didefinisikan dengan panah gemuk yang tidak melakukan apa-apa selain memanggil fungsi pertama sebagai contoh:
Jadi kapan menggunakan panah tipis / gemuk dapat diringkas dengan cukup mudah dalam empat cara:
Fungsi panah tipis saja harus digunakan ketika kedua kondisi terpenuhi:
Fungsi panah gemuk saja harus digunakan ketika kondisi berikut terpenuhi:
Fungsi panah gemuk yang secara langsung memanggil fungsi panah tipis harus digunakan ketika kondisi berikut terpenuhi:
Fungsi panah tipis yang langsung memanggil fungsi panah gemuk (tidak diperlihatkan) harus digunakan ketika kondisi berikut dipenuhi:
Dalam semua pendekatan itu harus dipertimbangkan dalam kasus di mana fungsi prototipe dapat diubah apakah perilaku untuk kasus tertentu akan berperilaku dengan benar misalnya misalnya meskipun fungsi didefinisikan dengan panah gemuk, perilakunya mungkin tidak konsisten dalam sebuah instance jika ia memanggil sebuah metode yang diubah dalam prototipe
sumber
Biasanya
->
baik-baik saja.Perhatikan bagaimana metode statis mengembalikan objek kelas untuk
this
dan instance mengembalikan objek instance untukthis
.Apa yang terjadi adalah bahwa sintaks doa memberikan nilai
this
. Dalam kode ini:foo
akan menjadi konteksbar()
fungsi secara default. Jadi itu hanya bekerja sesukamu. Anda hanya perlu panah gemuk ketika Anda memanggil fungsi ini dengan cara lain yang tidak menggunakan sintaks dot untuk doa.Dalam kedua kasus tersebut, menggunakan panah gemuk untuk menyatakan bahwa fungsi akan memungkinkan mereka untuk bekerja. Tetapi kecuali jika Anda melakukan sesuatu yang aneh, Anda biasanya tidak perlu melakukannya.
Jadi gunakan
->
sampai Anda benar-benar membutuhkan=>
dan tidak pernah menggunakan=>
secara default.sumber
x = obj.instance; alert x() == obj # false!
=>
akan diperlukan pada metode statis / instance kelas.// is not a CoffeeScript comment
sedangkan# is a CoffeeScript comment
.setTimeout foo.bar, 1000
"salah melakukannya"? Menggunakan panah gemuk jauh lebih baik daripada menggunakansetTimeout (-> foo.bar()), 1000
IMHO.setTimeout
, tentu saja. Tetapi komentar pertama Anda agak dibuat-buat dan tidak mengungkapkan kasus penggunaan yang sah, tetapi hanya mengungkapkan bagaimana itu bisa pecah. Saya hanya mengatakan bahwa Anda tidak boleh menggunakan a=>
kecuali jika Anda membutuhkannya untuk alasan yang baik, terutama pada metode instance kelas di mana ia memiliki biaya kinerja untuk menciptakan fungsi baru yang perlu terikat pada Instansiasi.hanya sebuah contoh untuk panah lemak yang luar biasa
tidak berfungsi: (@canvas tidak terdefinisi)
berfungsi: (didefinisikan oleh @canvas)
sumber