Vì vấn đề của bạn chủ yếu là về phong cách (không muốn lấp đầy các hàm tạo bằng một loạt các khai báo), nó cũng có thể được giải quyết theo kiểu cách.
Theo cách tôi xem, nhiều ngôn ngữ dựa trên lớp có hàm tạo là một hàm được đặt tên theo chính tên lớp. Về mặt phong cách, chúng ta có thể sử dụng điều đó để tạo ra một lớp ES6 mà theo phong cách vẫn có ý nghĩa nhưng không nhóm các hành động điển hình diễn ra trong hàm tạo với tất cả các khai báo thuộc tính mà chúng ta đang thực hiện. Chúng ta chỉ đơn giản sử dụng hàm tạo JS thực tế làm "vùng khai báo", sau đó tạo một hàm có tên lớp mà chúng ta coi là vùng "công cụ xây dựng khác", gọi nó là ở cuối của hàm tạo thực sự.
"Sử dụng nghiêm ngặt";
lớp MyClass
{
// chỉ khai báo các thuộc tính của bạn và sau đó gọi this.ClassName (); từ đây
constructor(){
this .prop1 = 'blah 1';
this .prop2 = 'blah 2';
this .prop3 = 'blah 3';
this.MyClass ();
}
// tất cả các loại công cụ "hàm tạo" khác, không còn bị xáo trộn với các khai báo
Lớp học của tôi() {
làm bất cứ điều gì();
}
}
Cả hai sẽ được gọi là thể hiện mới được xây dựng.
Sắp xếp giống như có 2 hàm tạo trong đó bạn tách riêng các khai báo và các hành động hàm tạo khác mà bạn muốn thực hiện, và theo kiểu cách làm cho nó không quá khó hiểu đó là những gì đang diễn ra.
Tôi thấy đó là một phong cách hay để sử dụng khi xử lý nhiều tuyên bố và / hoặc rất nhiều hành động cần phải xảy ra khi khởi tạo và muốn giữ hai ý tưởng khác biệt với nhau.
LƯU Ý : Tôi rất cố tình không sử dụng các ý tưởng thành ngữ điển hình về "khởi tạo" (như một phương pháp init()
hoặc initialize()
phương pháp) bởi vì những ý tưởng đó thường được sử dụng khác nhau. Có một sự khác biệt được cho là giữa ý tưởng xây dựng và khởi tạo. Làm việc với các nhà xây dựng, mọi người biết rằng họ được gọi tự động như một phần của việc khởi tạo. Nhìn thấy một init
phương pháp, nhiều người sẽ giả định mà không cần nhìn thoáng qua rằng họ cần phải làm gì đó theo hình thức var mc = MyClass(); mc.init();
, bởi vì đó là cách bạn thường khởi tạo. Tôi không cố gắng thêm quy trình khởi tạo cho người dùng của lớp, tôi đang cố thêm vào quy trình xây dựng của chính lớp đó.
Mặc dù một số người có thể thực hiện gấp đôi trong giây lát, nhưng đó thực sự là một phần của vấn đề: nó nói với họ rằng ý định là một phần của việc xây dựng, ngay cả khi điều đó khiến họ thực hiện một chút hai lần và đi "không phải vậy Làm thế nào các nhà xây dựng ES6 hoạt động "và mất một giây nhìn vào nhà xây dựng thực tế để nói" ồ, họ gọi nó ở phía dưới, tôi thấy ", điều đó tốt hơn nhiều so với việc KHÔNG truyền đạt ý định đó (hoặc truyền đạt không chính xác) và có thể nhận được rất nhiều mọi người sử dụng sai, cố gắng khởi tạo nó từ bên ngoài và rác. Đó là rất nhiều chủ ý cho mẫu tôi đề nghị.
Đối với những người không muốn theo mô hình đó, hoàn toàn ngược lại cũng có thể hoạt động. Farm khai báo ra chức năng khác lúc đầu. Có thể đặt tên cho nó là "tài sản" hoặc "công cộng" hoặc một cái gì đó. Sau đó đặt phần còn lại của công cụ vào hàm tạo bình thường.
"Sử dụng nghiêm ngặt";
lớp MyClass
{
tính chất() {
this .prop1 = 'blah 1';
this .prop2 = 'blah 2';
this .prop3 = 'blah 3';
}
constructor() {
this.properations ();
làm bất cứ điều gì();
}
}
Lưu ý rằng phương thức thứ hai này có thể trông sạch hơn nhưng nó cũng có một vấn đề cố hữu khi properties
bị ghi đè khi một lớp sử dụng phương thức này mở rộng phương thức khác. Bạn sẽ phải đặt nhiều tên độc đáo hơn properties
để tránh điều đó. Phương thức đầu tiên của tôi không gặp vấn đề này bởi vì một nửa hàm tạo của nó được đặt tên duy nhất theo lớp.
this.member = member
ở nhà xây dựng của mình với 20-30 tham số?