เนื่องจากปัญหาของคุณส่วนใหญ่เป็นโวหาร (ไม่ต้องการเติมคอนสตรัคเตอร์ด้วยการประกาศจำนวนมาก) ก็สามารถแก้ไขได้ด้วยโวหารเช่นกัน
วิธีที่ฉันดูมันภาษาที่ใช้หลายคลาสมีตัวสร้างเป็นฟังก์ชันที่ตั้งชื่อตามชื่อคลาสเอง เราสามารถใช้โวหารนั้นเพื่อสร้างคลาส ES6 ที่โวหารยังคงสมเหตุสมผล แต่ไม่จัดกลุ่มการกระทำทั่วไปที่เกิดขึ้นในคอนสตรัคเตอร์ด้วยการประกาศคุณสมบัติทั้งหมดที่เรากำลังทำอยู่ เราเพียงแค่ใช้ตัวสร้าง JS ที่แท้จริงเป็น "พื้นที่การประกาศ" จากนั้นทำคลาสฟังก์ชั่นชื่อที่เราจะถือว่าเป็น "พื้นที่ตัวสร้างสิ่งอื่น ๆ " เรียกมันในตอนท้ายของตัวสร้างที่แท้จริง
"ใช้อย่างเข้มงวด";
คลาส MyClass
{
// ประกาศคุณสมบัติของคุณเท่านั้นแล้วเรียก thisClassName (); จากที่นี่
คอนสตรัค () {
this.prop1 = 'blah 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
this.MyClass ();
}
// ทุกสิ่ง "คอนสตรัคเตอร์" อื่น ๆ ทุกประเภทไม่สับสนกับการประกาศอีกต่อไป
ห้องเรียนของฉัน() {
ทำอะไรก็ได้();
}
}
ทั้งสองจะถูกเรียกว่าเป็นตัวอย่างใหม่ที่ถูกสร้างขึ้น
Sorta เหมือนกับการมี 2 constructors ซึ่งคุณแยกการประกาศและการดำเนินการ constructor อื่น ๆ ที่คุณต้องการและ stylistically ทำให้ไม่ยากเกินกว่าที่จะเข้าใจนั่นคือสิ่งที่เกิดขึ้น
ฉันพบว่ามันเป็นสไตล์ที่ดีที่จะใช้เมื่อจัดการกับการประกาศจำนวนมากและ / หรือการดำเนินการจำนวนมากที่ต้องเกิดขึ้นในการสร้างอินสแตนซ์และต้องการให้แนวคิดทั้งสองแตกต่างจากกันและกัน
หมายเหตุ : ฉันตั้งใจจะไม่ใช้ความคิดที่เป็นสำนวนทั่วไปของ "การเริ่มต้น" (เช่นinit()
หรือinitialize()
วิธีการ) เพราะพวกเขามักจะใช้ที่แตกต่างกัน มีความแตกต่างระหว่างความคิดในการสร้างและการเริ่มต้นสันนิษฐานว่ามีความแตกต่าง การทำงานกับคอนสตรัคเตอร์คนรู้ว่าพวกเขาถูกเรียกโดยอัตโนมัติเป็นส่วนหนึ่งของการสร้างอินสแตนซ์ การเห็นinit
วิธีการที่หลายคนกำลังคาดเดาโดยไม่ต้องมองแวบเดียวว่าพวกเขาต้องทำอะไรบางอย่างในรูปแบบของvar mc = MyClass(); mc.init();
เพราะนั่นคือวิธีที่คุณมักจะเริ่มต้น ฉันไม่ได้พยายามที่จะเพิ่มการเริ่มต้นสำหรับผู้ใช้ของชั้นที่ฉันพยายามที่จะเพิ่มการดำเนินการก่อสร้างของชั้นเอง
ในขณะที่บางคนอาจใช้เวลาสองครั้งในขณะนั้นจริง ๆ แล้วมันเป็นประเด็น: มันสื่อสารกับพวกเขาว่าเจตนาเป็นส่วนหนึ่งของการก่อสร้างแม้ว่ามันจะทำให้พวกเขาทำสักหน่อยแล้วก็ไป "นั่นไม่ใช่ ช่างก่อสร้าง ES6 ทำงานอย่างไรและมองวินาทีที่ตัวสร้างจริงไป "โอ้พวกเขาเรียกมันว่าที่ด้านล่างฉันเห็น" ซึ่งดีกว่าการไม่สื่อสารความตั้งใจนั้น (หรือการสื่อสารที่ไม่ถูกต้อง) และอาจได้รับจำนวนมาก คนที่ใช้มันผิดพยายามเริ่มต้นจากด้านนอกและขยะ นั่นเป็นรูปแบบที่ฉันแนะนำ
สำหรับผู้ที่ไม่ต้องการทำตามรูปแบบนั้นสิ่งที่ตรงกันข้ามก็สามารถใช้ได้เช่นกัน ทำฟาร์มการประกาศออกไปยังฟังก์ชันอื่นเมื่อเริ่มต้น อาจตั้งชื่อมันว่า "คุณสมบัติ" หรือ "publicProperties" หรือบางอย่าง จากนั้นวางสิ่งของที่เหลือลงในตัวสร้างปกติ
"ใช้อย่างเข้มงวด";
คลาส MyClass
{
คุณสมบัติ() {
this.prop1 = 'blah 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
}
ตัวสร้าง () {
this.properties ();
ทำอะไรก็ได้();
}
}
โปรดทราบว่าวิธีที่สองนี้อาจดูสะอาดกว่า แต่ก็มีปัญหาโดยธรรมชาติที่properties
ได้รับการแทนที่เป็นชั้นหนึ่งโดยใช้วิธีนี้ขยายอีก คุณจะต้องให้ชื่อที่ไม่ซ้ำกันมากขึ้นproperties
เพื่อหลีกเลี่ยง วิธีแรกของฉันไม่มีปัญหานี้เพราะครึ่งหนึ่งของคอนสตรัคเตอร์ปลอมตั้งชื่อโดยไม่ซ้ำหลังคลาส
this.member = member
สตรัคเตอร์ด้วยพารามิเตอร์ 20-30 หรือไม่?