Saya bingung apa gunanya getter dan setter di kelas ECMAScript 6. Apa tujuannya? Di bawah ini adalah contoh yang saya maksud:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
class
ecmascript-6
setter
getter
TruMan1
sumber
sumber
Jawaban:
Penyetel dan pengambil ini memungkinkan Anda untuk menggunakan properti secara langsung (tanpa menggunakan tanda kurung)
Ini hanya untuk mengatur dan mendapatkan nilai properti.
sumber
set name(newName) { this._name = newName; }
Get:get name() { return this._name.toUpperCase(); }
Getters dan setter di ES6 memiliki tujuan yang sama dengan yang mereka lakukan dalam bahasa lain ... termasuk ES5. ES5 sudah mengizinkan getter dan setter lewat
Object.defineProperty
, meskipun mereka kurang bersih dan lebih rumit untuk digunakan.Secara efektif, getter dan setter memungkinkan Anda menggunakan notasi akses properti standar untuk membaca dan menulis sambil tetap memiliki kemampuan untuk menyesuaikan cara properti diambil dan dimutasi tanpa perlu metode pengambil dan penyetel eksplisit.
Di kelas Karyawan di atas, ini berarti Anda dapat mengakses
name
properti seperti ini:Ini akan terlihat seperti akses properti normal, tetapi sebenarnya akan memanggil
toUpperCase
nama sebelum mengembalikannya. Demikian pula, melakukan ini:akan mengakses setter, dan itu tidak akan mengubah
_name
properti internal karena klausa penjaga diperkenalkan diname
setter.Lihat juga pertanyaan umum Mengapa menggunakan getter dan setter? untuk informasi lebih lanjut tentang mengapa bisa mengubah fungsionalitas akses anggota itu berguna.
sumber
Getter dan setter ES6 memiliki motivasi yang jauh berbeda dari konsep serupa di Java.
Di Java, getter dan setter mengizinkan kelas untuk mendefinisikan JavaBean. Inti dari getter dan setter adalah memungkinkan bean memiliki "antarmuka" ortogonal sepenuhnya dari yang tersirat oleh field publik. Jadi saya dapat memiliki sebuah field "name" yang BUKAN merupakan property JavaBean, dan saya dapat memiliki sebuah property "address" JavaBean yang BUKAN sebuah field.
Properti JavaBean juga "dapat ditemukan" oleh ribuan kerangka kerja (Hibernate misalnya) melalui refleksi Java. Jadi, getter dan setter adalah bagian dari metode standar untuk "mengekspos" properti bean.
Getter dan setter, sebagai fungsi, juga memiliki nilai yang "mengabstraksikan" implementasi. Ini bisa SALAH SATU bidang atau nilai yang dihitung ("sintetik"). Jadi jika saya memiliki properti kacang yang disebut "kode pos", itu dimulai sebagai string yang disimpan. Sekarang misalkan saya ingin mengubahnya menjadi nilai yang dihitung dari alamat / kota / negara bagian?
Jika saya menggunakan bidang, kode ini rusak:
Tetapi jika saya menggunakan getter, ini tidak akan rusak:
JavaScript tidak memiliki yang seperti JavaBeans. Sejauh yang saya baca, nilai GET dan SET yang dimaksudkan terbatas pada properti "sintetik" (dihitung) tersebut di atas.
Tapi itu agak lebih baik daripada java karena Java tidak memungkinkan Anda untuk secara kompatibel mengubah "field" menjadi metode, ES6 GET dan SET memungkinkannya.
Artinya, jika saya memiliki:
Jika saya mengubah kode pos dari properti objek standar menjadi pengambil, kode di atas sekarang memanggil fungsi GET.
Perhatikan bahwa jika saya tidak menyertakan GET dalam definisi, ini TIDAK akan memanggil metode GET kode pos. Sebagai gantinya, itu hanya akan menetapkan kode pos fungsi ke var.
Jadi menurut saya ini adalah beberapa perbedaan penting untuk dipahami antara getter dan setter Java dan JavaScript ES6.
sumber
Pokoknya
getter
dansetter
itu seperti mata-mata. Ini memata-matai properti suatu objek, sehingga Anda dapat melakukan sesuatu, setiap kali Anda mendapatkan atau menetapkan nilai properti.sumber