function Person() {}, var person = Person(), và var person = new Person() là gì?Trong JavaScript, có ba cách sử dụng thường gặp liên quan đến hàm và đối tượng: function declaration, function invocation, và constructor invocation. Chúng ta sẽ phân tích kỹ từng cách sử dụng này và sự khác biệt giữa chúng.
function Person() {} (Function Declaration)Đây là một function declaration (khai báo hàm) đơn giản. Hàm này có thể được sử dụng như một hàm thông thường, hoặc như một constructor khi kết hợp với từ khóa new.
Ví dụ:
function Person() {
console.log('This is a function declaration');
}
Person là một hàm, và bạn có thể gọi nó ở bất cứ đâu trong phạm vi của nó. Trong trường hợp này, Person có thể được sử dụng để thực thi một đoạn mã cụ thể khi gọi hàm.Person trước cả khi nó được khai báo trong mã của bạn.var person = Person() (Function Invocation)Ở đây, bạn đang gọi hàm Person như một function invocation (gọi hàm thông thường) mà không sử dụng từ khóa new.
Ví dụ:
function Person() {
console.log('This is a function invocation');
return { name: 'John' };
}
var person = Person();
console.log(person); // { name: 'John' }
Person() mà không có từ khóa new, hàm sẽ thực thi giống như bất kỳ hàm nào khác. Nó có thể trả về một giá trị cụ thể (trong ví dụ trên, nó trả về một đối tượng { name: 'John' }).this trong hàm sẽ tham chiếu đến phạm vi toàn cục hoặc đối tượng hiện tại.person sẽ chứa giá trị trả về từ hàm Person(). Nếu hàm không có giá trị trả về (trả về undefined), person sẽ là undefined.var person = new Person() (Constructor Invocation)Khi bạn sử dụng từ khóa new, hàm Person được coi là một constructor function (hàm khởi tạo) và sẽ tạo ra một đối tượng mới.
Ví dụ:
function Person() {
this.name = 'John';
console.log('This is a constructor invocation');
}
var person = new Person();
console.log(person.name); // 'John'
Person() với từ khóa new, một đối tượng mới được tạo ra và this bên trong hàm sẽ tham chiếu đến đối tượng đó. Hàm sẽ gán các thuộc tính cho đối tượng mới này.new sẽ thực hiện ba điều chính:
this trong hàm.person sẽ chứa đối tượng mới được tạo bởi hàm Person, với thuộc tính name là 'John'.function Person() {} (Function Declaration):
var person = Person() (Function Invocation):
Person như một hàm thông thường. Không có đối tượng mới nào được tạo ra và từ khóa this sẽ tham chiếu đến phạm vi toàn cục hoặc đối tượng hiện tại.Person trả về một giá trị, biến person sẽ lưu giá trị đó.var person = new Person() (Constructor Invocation):
new, một đối tượng mới được tạo ra. Hàm Person trở thành một constructor và gán các thuộc tính cho đối tượng mới.person sẽ lưu đối tượng mới được tạo ra bởi hàm Person.// Khai báo hàm
function Person() {
this.name = 'John';
console.log('Person function is called');
return { age: 30 };
}
// Function Invocation
var person1 = Person(); // Gọi hàm như một hàm thông thường
console.log(person1); // { age: 30 }
// Constructor Invocation
var person2 = new Person(); // Gọi hàm như một constructor
console.log(person2); // { age: 30 }
console.log(person2.name); // undefined (vì đối tượng trả về từ hàm không chứa thuộc tính name)
Trong ví dụ này:
person1 chứa đối tượng { age: 30 } do hàm Person trả về khi gọi hàm thông thường.person2 cũng chứa đối tượng { age: 30 }, nhưng nó không chứa thuộc tính name vì hàm đã trả về đối tượng thay vì this.