Berbicara tentang penanda fitur di JS, saya selalu merasa agak aneh. Mengapa Anda berbicara tentang atribut ini? Itu berasal dari pertanyaan tentang suatu masalah. Kita semua tahu bahwa objek jendela sebenarnya
Karena instance dari jendela browser adalah instance, instance ini harus memiliki "properti" dan "metode", seperti yang berikut:
Ketika kami menggunakan fungsi, kami mendefinisikan beberapa properti, seperti nama, usia, dll., Dan kami juga dapat menghapus, mengatur, dan memperbarui operasi pada mereka.
Maka pertanyaan berikut adalah. Karena nama objek orang saya dapat dimodifikasi secara dinamis, sesuai dengan prinsip ini, saya juga harus dapat memodifikasi nilai yang tidak terdefinisi di bawah jendela, dan kemudian saya sangat tertarik untuk melihatnya.
Hasilnya masih bisa dibayangkan. Saya belum berhasil memodifikasi nilai yang tidak ditentukan, jadi mengapa ini terjadi? Tidak ada alasan. Ini bukan jenis pengemasan yang disebutkan dalam artikel sebelumnya, tetapi kami harus menghormati hasilnya. Ini menunjukkan bahwa JS yang mendasarinya pasti telah melakukan sesuatu untuk menyebabkan hasil seperti itu. Faktanya, dalam JS yang mendasarinya, writable = False Flag digunakan secara default untuk membuat atribut yang tidak ditentukan tidak tertulis. Mari kita lihat secara detail di bawah ini.
1: fitur [writable]
Ketika datang ke apakah atribut itu dapat ditulis, Anda mungkin memikirkan Get/Set Accessor di C# atau kata kunci readonly. Di bawah ini Anda pasti akan tertarik pada bagaimana saya harus melakukan operasi atribut hanya baca. Di JS, Anda hanya perlu menggunakan metode DefinEproperty.
Dari contoh di atas, Anda dapat melihat tiga hal menyenangkan:
<1>: Saya menggunakan metode DefinEproperty untuk mengubah orang. Nama menjadi bidang read-only. Seseorang ingin mengatakan bahwa ini jelas merupakan metode, tetapi bagaimana bisa menjadi fitur? Dalam pikiran saya, fiturnya
Mode [xxx], jadi ini adalah perbedaan antara JS. Bagaimanapun, JS tidak memiliki gula sintaksis, sehingga karakteristik definisi hanya dapat didefinisikan melalui metode publik yang mendasarinya, yaitu, definisi.
<2>: Saya tidak hanya melihat writable dalam metode ini, tetapi juga yang dapat dikonfigurasi. Jadi untuk apa ini? Bahkan, ini adalah konfigurasi dasar, memberi tahu mesin JS apakah dapat menghapus dan memperbarui atribut. Ketika saya mengatur yang dapat dikonfigurasi ke false, Anda tidak dapat menghapus p.name, karena ini akan menjadi operasi yang tidak valid.
Setelah membaca ini, saya pikir Anda harus mengerti mengapa tidak dapat dihapus atau diperbarui. Mereka semua terbuat dari tanda aneh, apakah menurut Anda itu sangat menarik?
<3>: Pertanyaan berikutnya yang layak dipikirkan adalah bagaimana mesin JS melakukannya. Ada juga atribut dalam C#, dan atribut ini akan direkam dalam metadata setelah dikompilasi oleh kompiler. Kemudian Anda dapat menggunakan refleksi untuk mendapatkan nilai apa pun di atribut Anda. Misalnya, kelas serialisasi serialisasi, yang memberi tahu serializable cara merefleksikan dan membaca kelas, bidang mana yang dapat diserialisasi, dan mana yang tidak dapat, dan Anda perlu menggunakan tag yang tidak terialisasi.
Salinan kode adalah sebagai berikut:
[Serializable]
tes kelas publik
{
[Nonserialized]
nama string publik;
}
Dari gambar tersebut, kita dapat melihat bahwa namanya tidak diawali di IL. Kita tahu bahwa tidak ada refleksi di JS, jadi terobosannya secara alami dalam metode defineproperty. Sayangnya, kami tidak dapat melihat seperti apa kode sumber yang mendasari dari metode ini, jadi kami tidak tahu apa yang terjadi pada bidang nama untuk secara dinamis membuatnya tidak dapat diprenakaanan. Kita hanya bisa menebak perilaku yang mungkin terjadi di mesin JS berdasarkan pemahaman kita.