Review Tôi có thể có nhiều hàm tạo trong JavaScript không?
Mẹo Hướng dẫn Tôi hoàn toàn có thể có nhiều hàm tạo trong JavaScript không? 2022
Bùi Thành Tài đang tìm kiếm từ khóa Tôi hoàn toàn có thể có nhiều hàm tạo trong JavaScript không? được Update vào lúc : 2022-12-21 18:32:06 . Với phương châm chia sẻ Kinh Nghiệm Hướng dẫn trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi đọc Post vẫn ko hiểu thì hoàn toàn có thể lại phản hồi ở cuối bài để Admin lý giải và hướng dẫn lại nha.Nếu bạn có nền tảng C#, bạn hoàn toàn có thể muốn thêm nhiều hàm tạo vào một lớp TypeScript. Mặc dù TypeScript không tương hỗ nhiều hàm tạo nhưng bạn vẫn hoàn toàn có thể đạt được hành vi tương tự
Nội dung chính Show- Làm cách nào để triển khai quá tải hàm tạo?Làm cách nào để sử dụng phương thức xuất xưởng để xây dựng một lớp?Làm cách nào để thêm một phần đối số lớp vào hàm tạo?Tôi hoàn toàn có thể có 2 hàm tạo không?Bạn hoàn toàn có thể có 3 hàm tạo trong Java không?Bạn hoàn toàn có thể có nhiều hàm tạo có cùng tên không?Tôi hoàn toàn có thể có hai hàm tạo trong TypeScript không?
Trong TypeScript, bạn hoàn toàn có thể thực hiện hành vi tương tự như việc thêm nhiều hàm tạo bằng phương pháp
- Thêm quá tải hàm tạo VÀ triển khai trình bảo vệ kiểu tùy chỉnhSử dụng phương thức nhà máy sản xuất tĩnh để xây dựng một lớpThêm một đối số lớp một phần vào hàm tạo
Bài viết này lý giải những giải pháp đó với những ví dụ về mã
Bắt tay vào làm nào 😎

Trong TypeScript, không in như những ngôn từ khác, bạn không thể định nghĩa nhiều hàm tạo bên trong một lớp. Tuy nhiên, bạn hoàn toàn có thể đạt được hành vi tương tự bằng phương pháp sử dụng một trong những phương pháp thay thế đó
Làm cách nào để triển khai quá tải hàm tạo?
Một phương pháp để mô phỏng việc thêm nhiều hàm tạo gồm có
Xác định quá tải nhiều hàm tạo bên trong một lớpThêm triển khai hàm tạo chính, để nó tương hỗ quá tải hàm tạo khácKiểm tra những đối số đã truyền bằng trình bảo vệ loại tùy chỉnhĐây là một ví dụ
typescriptclass MyClass private p1: string; private p2: number = 0; constructor(p1: string); constructor(p1: string, p2?: number) this.p1 = p1; if (p2) this.p2 = p2; const cls1 = new MyClass('Tim'); const cls2 = new MyClass('Tim', 27);Như bạn hoàn toàn có thể thấy, trong ví dụ này, tất cả chúng ta khai báo quá tải một hàm tạo và làm cho việc triển khai hàm tạo tương thích với nó
Và đây là một ví dụ phức tạp hơn với ba lần quá tải hàm tạo
typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.');Như bạn hoàn toàn có thể thấy, việc sử dụng quá tải hàm tạo trong TypeScript hoàn toàn có thể nhanh gọn trở nên khó quản lý và khó hiểu. Đó là nguyên do tại sao tôi thích phương pháp sau tốt hơn
Làm cách nào để sử dụng phương thức xuất xưởng để xây dựng một lớp?
Phương thức xuất xưởng để mô phỏng nhiều hàm tạo đơn giản hơn nhiều trong TypeScript. Nó liên quan đến việc thêm những hàm tĩnh của nhà máy sản xuất vào lớp sẽ khởi tạo nó bằng những đối số đúng chuẩn
Đây là một ví dụ
typescriptclass MyClass public p1: string = ''; public p2: number = 0; public static fromOneValue(p1: string): MyClass const cls = new MyClass(); cls.p1 = p1; return cls; public static fromTwoValues(p1: string, p2: number): MyClass const cls = new MyClass(); cls.p1 = p1; cls.p2 = p2; return cls; const cls1 = MyClass.fromOneValue('Tim'); const cls2 = MyClass.fromTwoValues('Tim', 27);Trong ví dụ này, thay vì thêm quá tải hàm tạo, chúng tôi thêm hai hàm tĩnh của nhà máy sản xuất để điền vào một thể hiện lớp mới với những đối số đúng chuẩn và trả về nó
Phương pháp này đơn giản hơn nhiều để hiểu và duy trì
Làm cách nào để thêm một phần đối số lớp vào hàm tạo?
Cuối cùng, bạn hoàn toàn có thể chuyển một phần lớp làm đối số của hàm tạo. Bằng cách đó, bạn hoàn toàn có thể chuyển bất kỳ đối số nào bạn muốn cho lớp
Đây là một ví dụ
typescriptclass MyClass private p1: string = ''; private p2: number = 0; constructor(params: Partial) Object.assign(this, params); const cls1 = new MyClass( p1: 'Tim' ); const cls2 = new MyClass( p1: 'Tim', p2: 27 );Như bạn hoàn toàn có thể thấy, tất cả chúng ta hoàn toàn có thể truyền bất kỳ đối số nào do lớp định nghĩa cho hàm tạo
Nhược điểm của phương pháp này là vì bạn hoàn toàn có thể truyền bất kỳ đối số nào bạn muốn, nên bạn hoàn toàn có thể bỏ qua tham số bắt buộc
Phương thức
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 là một phương thức đặc biệt của một lớp để tạo và khởi tạo một thể hiện đối tượng của lớp đóGhi chú. Trang này ra mắt cú pháp
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2. Đối với thuộc tính class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 có trên tất cả những đối tượng, xem class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 5________số 8
Hàm tạo được cho phép bạn đáp ứng bất kỳ khởi tạo tùy chỉnh nào phải được thực hiện trước bất kỳ phương thức nào khác hoàn toàn có thể được gọi trên một đối tượng được khởi tạo
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is OttoNếu bạn không đáp ứng hàm tạo của riêng mình, thì hàm tạo mặc định sẽ được đáp ứng cho bạn. Nếu lớp của bạn là lớp cơ sở, hàm tạo mặc định trống
typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 0Nếu lớp của bạn là lớp dẫn xuất, hàm tạo mặc định sẽ gọi hàm tạo cha, truyền theo bất kỳ đối số nào được đáp ứng
typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 1Ghi chú. Sự khác lạ giữa hàm tạo rõ ràng như hàm tạo ở trên và hàm tạo mặc định là hàm tạo mặc định không thực sự gọi trình lặp mảng thông qua trải rộng đối số
Điều đó được cho phép mã như vậy này hoạt động và sinh hoạt giải trí
typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 2Lớp
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 6 không cần hàm tạo rõ ràng, vì nó không cần thực hiện bất kỳ khởi tạo tùy chỉnh nào. Hàm tạo mặc định sau đó đảm nhận việc khởi tạo biến cha mẹ class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 7 từ đối số mà nó được đưa raTuy nhiên, nếu bạn đáp ứng hàm tạo của riêng mình và lớp của bạn bắt nguồn từ một số trong những lớp cha, thì bạn phải gọi rõ ràng hàm tạo của lớp cha bằng phương pháp sử dụng
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8. Ví dụtypescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 6Sử dụng
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 9 trên một lớp trải qua tiến trình sau(Nếu đó là lớp dẫn xuất) Phần thân của class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 trước lệnh gọi class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8 được đánh giá. Phần này tránh việc truy cập vào typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 02 vì nó không được khởi tạo(Nếu đó là lớp dẫn xuất) Cuộc gọi class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8 được đánh giá, khởi tạo lớp cha thông qua cùng một quy trìnhCác trường của lớp hiện tại được khởi tạoPhần thân của class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 sau lệnh gọi class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8 (hoặc toàn bộ phần thân, nếu đó là lớp cơ sở) được đánh giáTrong phần thân của
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2, bạn hoàn toàn có thể truy cập đối tượng được tạo thông qua typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 02 và truy cập lớp được gọi là class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 9 đến typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 09. Lưu ý rằng những phương thức (gồm có getters và setters) và chuỗi nguyên mẫu đã được khởi tạo trên typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 02 trước khi class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 được thực thi, vì vậy bạn thậm chí hoàn toàn có thể truy cập những phương thức của lớp con từ hàm tạo của lớp cha. Tuy nhiên, nếu những phương thức đó sử dụng typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 02, thì typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 02 sẽ không được khởi tạo hoàn toàn. Điều này nghĩa là việc đọc những trường công khai minh bạch của lớp dẫn xuất sẽ cho kết quả là typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 14, trong khi việc đọc những trường riêng tư sẽ cho kết quả là typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 15typescriptclass MyClass private p1: string = ''; private p2: number = 0; constructor(params: Partial) Object.assign(this, params); const cls1 = new MyClass( p1: 'Tim' ); const cls2 = new MyClass( p1: 'Tim', p2: 27 );4Phương thức
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 hoàn toàn có thể có mức giá trị trả về. Trong khi lớp cơ sở hoàn toàn có thể trả về bất kỳ thứ gì từ hàm tạo của nó, thì lớp dẫn xuất phải trả về một đối tượng hoặc typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 14, nếu không một typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 15 sẽ bị ném ra typescriptclass MyClass private p1: string = ''; private p2: number = 0; constructor(params: Partial) Object.assign(this, params); const cls1 = new MyClass( p1: 'Tim' ); const cls2 = new MyClass( p1: 'Tim', p2: 27 );8Nếu hàm tạo của lớp cha trả về một đối tượng, thì đối tượng đó sẽ được sử dụng làm giá trị
typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 02 trên đó những trường lớp của lớp dẫn xuất sẽ được xác định. Thủ thuật này được gọi là , được cho phép những trường của lớp dẫn xuất (gồm có cả trường riêng) được xác định trên những đối tượng không liên quanChỉ hoàn toàn có thể có một phương thức đặc biệt với tên
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 trong một lớp. Có nhiều hơn nữa một lần xuất hiện phương thức class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 trong một lớp sẽ gây ra lỗi typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 22. Có một getter hoặc setter được gọi là class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 cũng là một typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 22class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 2 tuân theo cú pháp phương thức thông thường, vì vậy những giá trị mặc định của tham số, tham số còn sót lại, v.v. tất cả đều hoàn toàn có thể được sử dụngclass Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 6Hàm tạo phải là một tên theo nghĩa đen. Thuộc tính được tính toán không thể trở thành hàm tạo
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 7Đoạn mã này được lấy từ mẫu lớp (bản demo trực tiếp)
class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 0class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8 gọi hàm tạo là nguyên mẫu của lớp hiện tại. Nếu bạn thay đổi nguyên mẫu của chính lớp hiện tại, class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8 sẽ gọi hàm tạo của nguyên mẫu mới. Việc thay đổi nguyên mẫu của thuộc tính typescriptclass MyClass public constructor(p1: number); public constructor(p1: string, p2: string); public constructor(p1: number, p2: string, p3: string); public constructor(...arr: any[]) if (arr.length === 2) console.log('two arguments constructor called.'); else if (arr.length === 3) console.log('three arguments constructor called.'); else if (arr.length === 1) console.log('one argument constructor called.'); 28 của lớp hiện tại không ảnh hưởng đến lệnh gọi hàm tạo nào của class Person constructor(name) this.name = name; introduce() console.log(`Hello, my name is $this.name`); const otto = new Person("Otto"); otto.introduce(); // Hello, my name is Otto 8
Post a Comment