Karena masalah Anda sebagian besar bergaya (tidak ingin mengisi konstruktor dengan banyak deklarasi), itu dapat diselesaikan dengan gaya juga.
Cara saya melihatnya, banyak bahasa berbasis kelas memiliki konstruktor menjadi fungsi yang dinamai dengan nama kelas itu sendiri. Secara gaya kita dapat menggunakannya untuk membuat kelas ES6 yang secara gaya masih masuk akal tetapi tidak mengelompokkan tindakan khas yang terjadi di konstruktor dengan semua deklarasi properti yang kami lakukan. Kami cukup menggunakan konstruktor JS aktual sebagai "area deklarasi", lalu membuat fungsi kelas bernama yang sebaliknya kami perlakukan sebagai area "konstruktor lain", menyebutnya di akhir konstruktor yang sebenarnya.
"gunakan ketat";
kelas MyClass
{
// hanya nyatakan properti Anda dan panggil ini.ClassName (); dari sini
constructor () {
this.prop1 = 'blah 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
this.MyClass ();
}
// segala macam hal "konstruktor" lainnya, tidak lagi campur aduk dengan deklarasi
Kelasku() {
lakukan Apa pun ();
}
}
Keduanya akan disebut sebagai instance baru dibangun.
Agak seperti memiliki 2 konstruktor di mana Anda memisahkan deklarasi dan tindakan konstruktor lain yang ingin Anda ambil, dan secara gaya membuatnya tidak terlalu sulit untuk memahami apa yang sedang terjadi juga.
Saya menemukan itu adalah gaya yang baik untuk digunakan ketika berhadapan dengan banyak deklarasi dan / atau banyak tindakan yang perlu terjadi pada instantiasi dan ingin menjaga dua ide berbeda satu sama lain.
CATATAN : Saya sangat sengaja tidak menggunakan ide idiomatik khas "menginisialisasi" (seperti metode init()
atau initialize()
) karena mereka sering digunakan secara berbeda. Ada semacam perbedaan dugaan antara gagasan membangun dan menginisialisasi. Bekerja dengan konstruktor, orang-orang tahu bahwa mereka dipanggil secara otomatis sebagai bagian dari Instansiasi. Melihat init
metode yang akan diasumsikan oleh banyak orang tanpa pandangan kedua bahwa mereka perlu melakukan sesuatu dalam bentuk var mc = MyClass(); mc.init();
, karena itulah cara Anda biasanya menginisialisasi. Aku tidak mencoba untuk menambahkan proses inisialisasi untuk pengguna kelas, aku mencoba untuk menambahkan ke proses pembangunan kelas itu sendiri.
Sementara beberapa orang mungkin melakukan pengambilan ganda untuk sesaat, itu sebenarnya intinya: itu menyampaikan kepada mereka bahwa maksudnya adalah bagian dari konstruksi, bahkan jika itu membuat mereka melakukan sedikit pengambilan ganda dan pergi "itu bukan bagaimana konstruktor ES6 bekerja "dan luangkan waktu sejenak melihat konstruktor yang sebenarnya untuk pergi" oh, mereka menyebutnya di bagian bawah, saya mengerti ", itu jauh lebih baik daripada TIDAK mengomunikasikan maksud itu (atau salah mengomunikasikannya) dan mungkin mendapatkan banyak orang menggunakannya salah, mencoba menginisialisasi dari luar dan sampah. Itu sangat disengaja dengan pola yang saya sarankan.
Bagi mereka yang tidak ingin mengikuti pola itu, kebalikannya bisa juga. Perkuat deklarasi ke fungsi lain di awal. Mungkin nama itu "properti" atau "properti publik" atau sesuatu. Kemudian letakkan sisanya di konstruktor normal.
"gunakan ketat";
kelas MyClass
{
properti () {
this.prop1 = 'blah 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
}
constructor () {
properti ini ();
lakukan Apa pun ();
}
}
Perhatikan bahwa metode kedua ini mungkin terlihat lebih bersih tetapi juga memiliki masalah yang melekat di mana properties
akan ditimpa karena satu kelas menggunakan metode ini meluas yang lain. Anda harus memberikan lebih banyak nama unik properties
untuk menghindari hal itu. Metode pertama saya tidak memiliki masalah ini karena setengah palsu dari konstruktor secara unik dinamai setelah kelas.
this.member = member
di konstruktor Anda dengan 20-30 parameter?