Cú pháp function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 0 thông thường cho phép chúng ta tạo một đối tượng. Nhưng thường thì chúng ta cần tạo nhiều đối tượng tương tự, như nhiều người dùng hoặc mục menu, v.v.Điều đó có thể được thực hiện bằng cách sử dụng hàm tạo và toán tử function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 1Các hàm xây dựng về mặt kỹ thuật là các hàm thông thường. Có hai quy ước mặc dù - Họ được đặt tên với chữ in hoa đầu tiên
- Chúng chỉ nên được thực thi với toán tử
function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 1
Ví dụ function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Jack");
alert(user.name); // Jack
alert(user.isAdmin); // false
Khi một hàm được thực thi với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3, nó sẽ thực hiện các bước sau- Một đối tượng trống mới được tạo và gán cho
function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 - Thân hàm thực thi. Thông thường, nó sửa đổi
function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4, thêm các thuộc tính mới vào nó - Giá trị của
function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 được trả về
Nói cách khác, function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 7 làm điều gì đó giống nhưfunction User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
}
Vì vậy, function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 8 cho kết quả tương tự nhưlet user = {
name: "Jack",
isAdmin: false
};
Bây giờ nếu chúng tôi muốn tạo những người dùng khác, chúng tôi có thể gọi function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 9, let user = {
name: "Jack",
isAdmin: false
}; 0, v.v. Ngắn hơn nhiều so với sử dụng chữ mỗi lần và cũng dễ đọcĐó là mục đích chính của các nhà xây dựng - để triển khai mã tạo đối tượng có thể tái sử dụng Hãy lưu ý một lần nữa – về mặt kỹ thuật, bất kỳ hàm nào (ngoại trừ hàm mũi tên, vì chúng không có function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4) đều có thể được sử dụng làm hàm tạo. Nó có thể được chạy với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3 và nó sẽ thực hiện thuật toán trên. “Chữ viết hoa trước” là một thỏa thuận phổ biến, để làm rõ rằng một chức năng sẽ được chạy với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3hàm mới() { … } Nếu chúng ta có nhiều dòng mã về việc tạo một đối tượng phức tạp duy nhất, chúng ta có thể bọc chúng trong một hàm xây dựng được gọi ngay lập tức, như thế này // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
};
Hàm tạo này không thể được gọi lại vì nó không được lưu ở bất kỳ đâu, chỉ được tạo và gọi. Vì vậy, thủ thuật này nhằm mục đích đóng gói mã xây dựng một đối tượng mà không sử dụng lại trong tương lai Nội dung nâng cao Cú pháp từ phần này hiếm khi được sử dụng, hãy bỏ qua trừ khi bạn muốn biết mọi thứ Bên trong một hàm, chúng ta có thể kiểm tra xem nó có được gọi với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3 hay không, bằng cách sử dụng một thuộc tính đặc biệt let user = {
name: "Jack",
isAdmin: false
}; 5Nó không được xác định cho các cuộc gọi thông thường và bằng chức năng nếu được gọi với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3function User() {
alert(new.target);
}
// without "new":
User(); // undefined
// with "new":
new User(); // function User { .. }
Điều đó có thể được sử dụng bên trong hàm để biết liệu nó được gọi với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3, “ở chế độ hàm tạo” hay không, “ở chế độ thông thường”Chúng tôi cũng có thể thực hiện cả cuộc gọi function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3 và thông thường để làm điều tương tự, như thế nàyfunction User(name) {
if (!new.target) { // if you run me without new
return new User(name); // ...I will add new for you
}
this.name = name;
}
let john = User("John"); // redirects call to new User
alert(john.name); // John
Cách tiếp cận này đôi khi được sử dụng trong các thư viện để làm cho cú pháp linh hoạt hơn. Để mọi người có thể gọi hàm có hoặc không có function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3, và nó vẫn hoạt độngTuy nhiên, có lẽ không phải là một điều tốt để sử dụng ở mọi nơi, bởi vì việc bỏ qua function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3 làm cho nó ít rõ ràng hơn về những gì đang diễn ra. Với function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3 chúng ta đều biết rằng đối tượng mới đang được tạoThông thường, hàm tạo không có câu lệnh // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2. Nhiệm vụ của họ là viết tất cả những thứ cần thiết vào function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4, và nó tự động trở thành kết quảNhưng nếu có một câu lệnh // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2, thì quy tắc rất đơn giản- Nếu
// create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2 được gọi với một đối tượng, thì đối tượng đó sẽ được trả về thay vì function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 - Nếu
// create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2 được gọi với số nguyên thủy, nó sẽ bị bỏ qua
Nói cách khác, // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2 với một đối tượng trả về đối tượng đó, trong tất cả các trường hợp khác, function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 được trả vềChẳng hạn, ở đây // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2 ghi đè function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 bằng cách trả về một đối tượngfunction BigUser() {
this.name = "John";
return { name: "Godzilla" }; // <-- returns this object
}
alert( new BigUser().name ); // Godzilla, got that object
Và đây là một ví dụ với một // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2 trống (hoặc chúng ta có thể đặt một số nguyên thủy sau nó, không thành vấn đề)function SmallUser() {
this.name = "John";
return; // <-- returns this
}
alert( new SmallUser().name ); // John
Thông thường các nhà xây dựng không có câu lệnh // create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
}; 2. Ở đây chúng tôi đề cập đến hành vi đặc biệt với các đối tượng trả về chủ yếu vì mục đích hoàn thiệnBỏ qua dấu ngoặc đơn Nhân tiện, chúng ta có thể bỏ qua dấu ngoặc đơn sau function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3let user = new User; // <-- no parentheses
// same as
let user = new User();
Bỏ qua dấu ngoặc đơn ở đây không được coi là "phong cách tốt", nhưng cú pháp được cho phép theo đặc điểm kỹ thuật Sử dụng các hàm xây dựng để tạo các đối tượng mang lại rất nhiều tính linh hoạt. Hàm xây dựng có thể có các tham số xác định cách xây dựng đối tượng và những gì cần đặt trong đó Tất nhiên, chúng ta có thể thêm vào function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 không chỉ các thuộc tính mà cả các phương thứcChẳng hạn, function User() {
alert(new.target);
}
// without "new":
User(); // undefined
// with "new":
new User(); // function User { .. } 6 bên dưới tạo một đối tượng với function User() {
alert(new.target);
}
// without "new":
User(); // undefined
// with "new":
new User(); // function User { .. } 7 đã cho và phương thức function User() {
alert(new.target);
}
// without "new":
User(); // undefined
// with "new":
new User(); // function User { .. } 8function User(name) {
this.name = name;
this.sayHi = function() {
alert( "My name is: " + this.name );
};
}
let john = new User("John");
john.sayHi(); // My name is: John
/*
john = {
name: "John",
sayHi: function() { .. }
}
*/
Để tạo các đối tượng phức tạp, có một cú pháp nâng cao hơn, các lớp, mà chúng ta sẽ đề cập sau - Các hàm xây dựng hay ngắn gọn là các hàm tạo là các hàm thông thường, nhưng có một thỏa thuận chung là đặt tên chúng bằng chữ in hoa trước
- Hàm xây dựng chỉ nên được gọi bằng cách sử dụng
function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 3. Một cuộc gọi như vậy ngụ ý tạo ra một function User(name) {
// this = {}; (implicitly)
// add properties to this
this.name = name;
this.isAdmin = false;
// return this; (implicitly)
} 4 trống ở đầu và trả về một cái đã điền ở cuối
Chúng ta có thể sử dụng các hàm tạo để tạo nhiều đối tượng giống nhau JavaScript cung cấp các hàm tạo cho nhiều đối tượng ngôn ngữ tích hợp. như function User(name) {
if (!new.target) { // if you run me without new
return new User(name); // ...I will add new for you
}
this.name = name;
}
let john = User("John"); // redirects call to new User
alert(john.name); // John 1 cho ngày tháng, function User(name) {
if (!new.target) { // if you run me without new
return new User(name); // ...I will add new for you
}
this.name = name;
}
let john = User("John"); // redirects call to new User
alert(john.name); // John 2 cho bộ và những thứ khác mà chúng tôi dự định họcĐối tượng, chúng tôi sẽ trở lại Trong chương này chúng ta chỉ trình bày những kiến thức cơ bản về đối tượng và hàm tạo. Chúng rất cần thiết để tìm hiểu thêm về các kiểu dữ liệu và chức năng trong các chương tiếp theo Sau khi biết điều đó, chúng ta quay lại các đối tượng và tìm hiểu sâu hơn về chúng trong các chương Nguyên mẫu, kế thừa và Lớp
Làm cách nào để gọi hàm tạo trong JavaScript?
Constructor là một hàm đặc biệt dùng để tạo và khởi tạo một thể hiện đối tượng của một lớp. Trong JavaScript, hàm tạo được gọi khi một đối tượng được tạo bằng từ khóa mới . Mục đích của hàm tạo là tạo đối tượng mới và đặt giá trị cho bất kỳ thuộc tính đối tượng hiện có nào.
Toán tử nào được sử dụng để gọi hàm tạo?
Gọi hàm tạo có nghĩa là gì?
Việc gọi một hàm tạo xây dựng một đối tượng mới của lớp mà hàm tạo thuộc về và trả về một tham chiếu đến đối tượng đã tạo . Đối tượng được xây dựng bằng cách sử dụng các tham số được truyền cho hàm tạo.
Hàm tạo có được gọi tự động không?
Constructor trong C++ là một phương thức đặc biệt được gọi tự động tại thời điểm tạo đối tượng . Nó được sử dụng để khởi tạo các thành viên dữ liệu của các đối tượng mới nói chung. Hàm tạo trong C++ có cùng tên với lớp hoặc cấu trúc. |