Từ khóa new
trong JavaScript được sử dụng để tạo ra một đối tượng mới từ một hàm khởi tạo (constructor function). Khi sử dụng new
, một loạt các bước cụ thể được thực hiện để khởi tạo đối tượng và liên kết nó với prototype của constructor. Đây là một phần quan trọng trong cách hoạt động của lập trình hướng đối tượng (OOP) trong JavaScript.
Cụ thể, từ khóa new
thực hiện các bước sau:
- Tạo một đối tượng trống mới:
- JavaScript sẽ tạo một đối tượng mới và trống (empty object). Đối tượng này sẽ là đối tượng cuối cùng được trả về từ hàm khởi tạo.
- Thiết lập prototype cho đối tượng mới:
- Đối tượng mới được tạo ra sẽ liên kết với prototype của hàm khởi tạo (constructor). Nói cách khác, prototype của hàm khởi tạo sẽ được gán vào thuộc tính
[[Prototype]]
của đối tượng mới.
- Gọi hàm khởi tạo với
this
trỏ tới đối tượng mới:
- Hàm khởi tạo (constructor function) được gọi và
this
bên trong hàm sẽ tham chiếu đến đối tượng mới. Điều này cho phép hàm khởi tạo gán các thuộc tính và phương thức cho đối tượng.
- Trả về đối tượng mới (hoặc giá trị khác nếu trả về đối tượng):
- Nếu hàm khởi tạo không trả về một đối tượng rõ ràng, thì đối tượng mới được tạo ra sẽ được trả về. Nếu hàm khởi tạo trả về một đối tượng (không phải một kiểu dữ liệu nguyên thủy), thì đối tượng đó sẽ được trả về thay vì đối tượng mới được tạo.
Cú pháp
const obj = new ConstructorFunction();
Ví dụ minh họa
1. Sử dụng new
với hàm khởi tạo (constructor function):
function Person(name, age) {
// `this` tham chiếu đến đối tượng mới
this.name = name;
this.age = age;
// Phương thức
this.sayHello = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
}
// Tạo đối tượng mới bằng từ khóa `new`
const person1 = new Person("Alice", 25);
person1.sayHello(); // "Hello, my name is Alice and I am 25 years old."
Trong ví dụ trên:
- Hàm
Person
là hàm khởi tạo (constructor function).
- Khi
new Person("Alice", 25)
được gọi, một đối tượng mới được tạo, với this
trong hàm khởi tạo trỏ đến đối tượng này.
- Các thuộc tính
name
và age
được gán cho đối tượng mới và phương thức sayHello
cũng được gán.
2. Liên kết với prototype:
function Animal(type) {
this.type = type;
}
// Thêm phương thức vào prototype của hàm khởi tạo
Animal.prototype.getType = function() {
return this.type;
};
const dog = new Animal("Dog");
console.log(dog.getType()); // "Dog"
Trong ví dụ này, từ khóa new
giúp đối tượng dog
kế thừa các phương thức từ prototype của Animal
. Phương thức getType
được chia sẻ giữa tất cả các đối tượng được tạo ra từ hàm khởi tạo Animal
, giúp tối ưu hóa bộ nhớ.
3. Bỏ qua giá trị trả về nguyên thủy:
function Test() {
this.value = 42;
return 100; // Giá trị trả về này sẽ bị bỏ qua
}
const test = new Test();
console.log(test.value); // 42
Trong trường hợp này, mặc dù hàm Test
trả về giá trị nguyên thủy 100
, đối tượng mới được tạo từ new Test()
vẫn được trả về.
4. Trả về một đối tượng khác:
function AnotherTest() {
this.value = 42;
return { a: 1, b: 2 }; // Trả về một đối tượng khác
}
const anotherTest = new AnotherTest();
console.log(anotherTest); // { a: 1, b: 2 }
Trong ví dụ này, vì hàm khởi tạo trả về một đối tượng (không phải nguyên thủy), đối tượng được trả về sẽ là { a: 1, b: 2 }
, thay vì đối tượng mới với thuộc tính value
.
Từ khóa new
có vai trò gì trong lập trình hướng đối tượng?
Trong JavaScript, từ khóa new
đóng vai trò quan trọng trong việc triển khai lập trình hướng đối tượng (OOP):
- Nó cho phép bạn tạo các đối tượng từ các hàm khởi tạo và tận dụng tính năng chia sẻ phương thức qua prototype.
- Việc sử dụng
new
giúp dễ dàng xây dựng các hệ thống với nhiều đối tượng có cùng đặc điểm hoặc phương thức, đồng thời tối ưu hóa hiệu suất bằng cách không tạo lại các phương thức cho từng đối tượng riêng lẻ.
Tổng kết:
- Từ khóa
new
được sử dụng để khởi tạo các đối tượng mới từ constructor function.
- Nó thực hiện các bước: tạo đối tượng mới, liên kết prototype, gọi constructor với
this
và trả về đối tượng mới.
new
đóng vai trò quan trọng trong lập trình hướng đối tượng, giúp quản lý các đối tượng và phương thức một cách hiệu quả.