Apakah awalan garis bawah dalam JavaScript hanya sebuah konvensi, seperti misalnya dalam metode kelas privat Python?
Dari dokumentasi 2,7 Python:
Variabel instance "Privat" yang tidak dapat diakses kecuali dari dalam suatu objek tidak ada dalam Python. Namun, ada konvensi yang diikuti oleh sebagian besar kode Python: nama diawali dengan garis bawah (misalnya _spam) harus diperlakukan sebagai bagian non-publik dari API (apakah itu fungsi, metode atau anggota data) .
Apakah ini juga berlaku untuk JavaScript?
Ambil contoh kode JavaScript ini:
function AltTabPopup() {
this._init();
}
AltTabPopup.prototype = {
_init : function() {
...
}
}
Juga, variabel awali garis bawah digunakan.
...
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
...
Hanya konvensi? Atau ada lebih banyak di belakang awalan garis bawah?
Saya mengakui pertanyaan saya sangat mirip dengan pertanyaan ini , tetapi tidak membuat orang lebih pintar tentang pentingnya awalan garis bawah dalam JavaScript.
sumber
Jawaban:
Selamat datang di 2019!
Tampaknya proposal untuk memperluas sintaksis kelas untuk memungkinkan
#
variabel awalan menjadi pribadi diterima. Chrome 74 dikirimkan dengan dukungan ini._
nama variabel yang diawali dianggap pribadi oleh konvensi tetapi masih publik.Lihat https://caniuse.com/#feat=mdn-javascript_classes_private_class_fields
sumber
Itu hanya sebuah konvensi. Bahasa Javascript tidak memberikan arti khusus untuk pengidentifikasi dimulai dengan karakter garis bawah.
Karena itu, konvensi ini cukup berguna untuk bahasa yang tidak mendukung enkapsulasi . Meskipun tidak ada cara untuk mencegah seseorang menyalahgunakan implementasi kelas Anda, setidaknya itu menjelaskan maksud Anda, dan mendokumentasikan perilaku seperti itu salah sejak awal.
sumber
_
saya ingin tahu apa yang terjadi !? mengapa tidakthis.name
?console.log(someone._name = "Jean Dupont");
berfungsi jugaconsole.log(someone.name);
, dan itu menugaskan dan mengevaluasi anggota underscore-awalan di belakang properti. Seperti yang Anda lihat , tidak ada enkapsulasi dijamin melalui garis bawah :)JavaScript sebenarnya mendukung enkapsulasi, melalui metode yang melibatkan penyembunyian anggota dalam penutupan (Crockford). Yang mengatakan, itu kadang-kadang rumit, dan konvensi garis bawah adalah konvensi yang cukup bagus untuk digunakan untuk hal-hal yang bersifat pribadi, tetapi Anda tidak perlu bersembunyi.
sumber
JSDoc 3 memungkinkan Anda untuk membubuhi keterangan fungsi Anda dengan
@access private
(sebelumnya@private
tag) yang juga berguna untuk menyiarkan maksud Anda ke pengembang lain - http://usejsdoc.org/tags-access.htmlsumber
Terlepas dari konvensi privasi, saya juga ingin membantu membawa kesadaran bahwa awalan garis bawah juga digunakan untuk argumen yang bergantung pada argumen independen, khususnya di peta jangkar URI. Kunci dependen selalu mengarah ke peta.
Contoh (dari https://github.com/mmikowski/urianchor ):
Jangkar URI pada bidang pencarian browser diubah menjadi:
Ini adalah konvensi yang digunakan untuk menggerakkan status aplikasi berdasarkan perubahan hash.
sumber
import/export
sekarang melakukan pekerjaan dengan ES6. Saya masih cenderung awalan dengan fungsi yang tidak diekspor dengan_
jika sebagian besar fungsi saya diekspor.Jika Anda hanya mengekspor kelas (seperti dalam proyek sudut), itu tidak diperlukan sama sekali.
sumber