Artikel ini memberi Anda pengetahuan yang relevan tentang JavaScript, yang terutama memperkenalkan isu-isu terkait tentang berorientasi objek, termasuk deskriptor atribut, deskriptor data, deskriptor akses, dll. Mari kita lihat bersama-sama.
[Rekomendasi terkait: tutorial video javascript, web front-end]
JavaScript sebenarnya mendukung berbagai paradigma pemrograman, termasuk pemrograman fungsional dan pemrograman berorientasi objek:
Objek dalam JavaScript dirancang sebagai kumpulan atribut yang tidak berurutan , seperti tabel hip-hop, yang terdiri dari kunci dan nilai;
Kuncinya adalah nama pengidentifikasi, dan nilainya dapat berupa tipe apa pun, atau tipe objek atau fungsi lain;
Jika nilainya adalah fungsi, maka kita dapat menyebutnya sebagai metode objek ;
Cara paling umum untuk membuat objek di masa-masa awal adalah dengan menggunakan kelas Object, dan menggunakan kata kunci new untuk membuat objek, lalu menyimpan properti atau metode ke dalam objek:
var obj = Objek baru() obj.nama = 'mengapa' console.log(obj.nama, obj) // mengapa { nama: 'mengapa' }
Belakangan, demi kenyamanan, banyak pengembang membuat objek langsung dalam bentuk literal:
//Metode literal var obj2 = { nama: 'jam', umur: '8' } console.log(obj) // { nama: 'jam', umur: '8' }
Sebelumnya, properti kita didefinisikan secara langsung di dalam objek, atau ditambahkan langsung ke objek;
Namun dengan cara ini kita tidak dapat memaksakan beberapa batasan pada atribut ini: misalnya, dapatkah atribut ini dihapus melalui delect
, dan dapatkah atribut tersebut dilintasi selama traversal for-in
?
Jika kita ingin memiliki kontrol operasional yang lebih tepat atas suatu atribut, maka saya dapat menggunakan atribut descriptors . Properti suatu objek dapat ditambahkan atau dimodifikasi secara akurat melalui deskriptor properti;
Deskriptor properti perlu menggunakan Object.defineProperty
untuk menambah atau mengubah properti.
属性描述符分为两种:数据描述符和存取描述符
Deskriptor data adalah properti dengan nilai yang dapat ditulis atau tidak. Deskriptor data memiliki nilai kunci opsional berikut:
value: Nilai yang sesuai dengan atribut ini. Dapat berupa nilai JavaScript apa pun yang valid (nilai numerik, objek, fungsi, dll.). Standarnya tidak ditentukan.
dapat ditulis: Jika dan hanya jika atribut yang dapat ditulis ini benar, nilainya dapat diubah oleh operator penyalinan. Standarnya salah.
dapat dikonfigurasi: Jika dan hanya jika atribut yang dapat dikonfigurasi benar, deskriptor atribut dapat diubah, dan atribut juga dapat dihapus dari objek terkait. Standarnya salah.
enumerable: Jika dan hanya jika enumerable properti tersebut benar, properti tersebut dapat muncul dalam properti enumerasi objek. Standarnya salah.
Metode Object.getOwnPropertyDescriptor() mengembalikan deskriptor properti yang sesuai dengan properti sendiri pada objek yang ditentukan.
Objek.getOwnPropertyDescriptor(obj, prop)
obj: objek target yang ingin ditemukan
prop: nama atribut pada objek target (tipe String).
Nilai yang dikembalikan: Jika properti yang ditentukan ada pada objek, objek deskriptor propertinya akan dikembalikan, jika tidak, tidak terdefinisi akan dikembalikan.
Catatan: Jika parameter pertama metode ini bukan objek, kesalahan (TypeError) akan dilaporkan.
Metode Object.defineProperty() secara langsung mendefinisikan properti baru pada suatu objek, atau memodifikasi properti objek yang sudah ada, dan mengembalikan objek tersebut.
Objek.defineProperty(obj, prop, deskriptor)
obj: Objek yang propertinya akan didefinisikan.
prop: Nama properti yang akan didefinisikan atau diubah.
deskriptor: deskriptor atribut yang akan didefinisikan atau dimodifikasi
Nilai kembalian: objek diteruskan ke fungsi
Contoh kode berikut menunjukkan pengaturan dan perolehan deskriptor atribut var obj = { nama: 'selai', usia: 8 } Objek.defineProperty(obj, 'pekerjaan', { nilai: 'pengacara' }) console.log(Object.getOwnPropertyDescriptor(obj, 'age')) // { nilai: 8, dapat ditulis: benar, dapat dihitung: benar, dapat dikonfigurasi: benar } console.log(obj.job) // Pengacara // Properti baru melalui defineProperty, properti baru ini tidak dapat dimodifikasi, tidak dapat dihapus, dan tidak dapat dihitung console.log(Object.getOwnPropertyDescriptor(obj, 'job')) / / {nilai: 'Pengacara', dapat ditulis: salah, dapat dihitung: salah, dapat dikonfigurasi: salah}
注意:通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的
var objek = { nama: 'selai', usia: 8 } Objek.defineProperty(obj, 'alamat', { nilai: 'Hebei', // dapat dikonfigurasi Properti ini tidak dapat dihapus, Anda juga tidak dapat menggunakan defineProperty untuk mengubah deskriptor properti lagi dapat dikonfigurasi: false, }) delete obj.address // Saya ingin menggunakan delete untuk menghapus atribut ini obj.address = 'Guangzhou' // Saya ingin mengubah nilai alamat atribut di obj ke Guangzhou console.log(obj.address) // Hasil keluaran: Hebei
Karena nilai konfigurasi deskriptor atribut salah dan tidak dapat dihapus atau diubah, penghapusan dan modifikasi tidak akan berlaku.
var objek = { nama: 'selai', umur: 8}Object.defineProperty(obj, 'sex ', { nilai: 'Pria', // enumerable mengonfigurasi apakah properti ini dapat dihitung enumerable: true})for (i in obj) { konsol.log(i)}
Ketika enumerable: false, hasil keluarannya adalah nama umur
Jika enumerable: true, hasil keluarannya adalah nama umur jenis kelamin
var objek = { nama: 'selai', usia: 8}Object.defineProperty(obj, 'score', { nilai: 80, // dapat ditulis: benar dapat ditulis: false})obj.score = 100 console.log(obj.score) // 80
Karena nilai writeable salah, maka ketika skor diubah menjadi 100, modifikasi tidak berhasil, dan keluaran akhir adalah 80.
Apakah Anda merasa sulit untuk menyetel deskriptor properti hanya pada satu properti dalam satu waktu? Object.defineProperties dapat membantu Anda memecahkan masalah tersebut.
Metode Object.defineProperties() mendefinisikan satu atau beberapa properti baru atau memodifikasi properti yang ada untuk suatu objek, dan mengembalikan objek tersebut.
Objek.defineProperties(obj, props)
obj: Objek yang propertinya akan didefinisikan.
props: Objek yang properti enumerablenya atau deskriptor propertinya yang dimodifikasi harus didefinisikan.
Nilai kembalian: Objek diteruskan ke fungsi.
Contoh kodenya adalah sebagai berikut:
var objek = { nama: 'jam',}Object.defineProperties(obj, { 'usia': { nilai: 28, dapat ditulis: benar, dapat dikonfigurasi: salah, dapat dihitung: benar }, 'pekerjaan': { nilai: 'pengacara', dapat ditulis: benar, dapat dikonfigurasi: salah, dapat dihitung: benar }, 'seks': { nilai: 'Pria', dapat ditulis: salah, dapat dikonfigurasi: salah, dapat dihitung: benar }, 'tinggi': { nilai: '1,8 m', dapat ditulis: salah, dapat dikonfigurasi: salah, dapat dihitung: benar }})console.log(obj) // nama: 'jam', usia: 28, pekerjaan: 'pengacara', jenis kelamin: 'pria', tinggi: '1,8m' }
Deskriptor akses adalah properti yang dijelaskan oleh pasangan fungsi pengambil-penyetel. Deskriptor akses memiliki nilai kunci opsional berikut:
get: Menyediakan metode pengambil untuk properti. Jika tidak ada pengambil, maka properti tersebut tidak terdefinisi. Saat properti ini diakses, metode akan dieksekusi. Tidak ada parameter yang diteruskan saat metode dijalankan, namun objek ini akan diteruskan.
set: Menyediakan metode penyetel untuk properti. Jika tidak ada penyetel, properti tersebut tidak akan ditentukan. Metode ini dipicu ketika nilai properti diubah. Metode ini akan menerima satu-satunya parameter, yaitu nilai parameter baru dari properti.
dapat dikonfigurasi: Jika dan hanya jika atribut yang dapat dikonfigurasi benar, deskriptor atribut dapat diubah, dan atribut juga dapat dihapus dari objek terkait. Standarnya salah.
Enurnerable: Jika dan hanya jika enurnerable suatu atribut benar, atribut tersebut dapat muncul dalam atribut enumerasi objek. Standarnya salah.
Penggunaan configurable dan enurnerable konsisten dengan deskriptor data, jadi saya tidak akan menjelaskannya secara detail di sini.
Terutama berbicara tentang penggunaan metode get dan set
var objek = { nama: 'selai', usia: 8, _alamat: 'Hebei' } // Skenario penggunaan deskriptor akses // 1. Menyembunyikan atribut privat tertentu yang diharapkan bisa langsung digunakan dan ditetapkan oleh dunia luar // 2. Jika kita ingin memahami proses pengaksesan dan pengaturan nilai atribut tertentu , kami juga akan menggunakannya Deskriptor properti penyimpanan Object.defineProperty(obj, 'address', { dapat dihitung: benar, dapat dikonfigurasi: benar, dapatkan: fungsi () { foo() kembalikan ini._alamat }, set: fungsi (nilai) { batang() this._address = nilai } }) fungsi foo () { console.log("Mencegat nilai alamat satu kali") } bilah fungsi () { console.log("Nilai alamat ditetapkan satu kali") }
Konsol kode contoh di atas mencetak hasil berikut: