Việc gọi một hàm bằng new
sẽ tạo một đối tượng mới bằng cách sử dụng hàm được gọi dưới dạng
"hàm khởi tạo" cho đối tượng đó:
function MyFunction() {}
const myObject = new MyFunction();
typeof myObject;
> "object"`
Thao tác này cho phép "hàm khởi tạo" cung cấp một mẫu để tạo các đối tượng tuân theo cùng một mẫu cấu trúc:
function MyFunction() {
this.myProperty = true;
}
const myObject = new MyFunction();
myObject.myProperty;
> true
Giá trị của this
trong hàm khởi tạo đề cập đến đối tượng đang được tạo, cho phép điền các thuộc tính và phương thức vào đối tượng tại thời điểm tạo. Điều này cho phép
việc tạo đối tượng chứa giá trị dữ liệu và bất kỳ phương thức nào cần thiết để hành động
dữ liệu đó dưới dạng một đơn vị di động duy nhất, khái niệm được gọi là "đóng gói":
function MyFunction( myArgument ) {
this.myValue = myArgument;
this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );
myObject.myValue;
> 10
myObject.doubleMyValue();
> 20
this
đề cập đến quá trình thực thi hiện tại
ngữ cảnh của một hàm, tức là hàm khởi tạo tuân theo cùng một
các quy tắc cho giá trị this
như bất kỳ hàm nào khác. Ví dụ: hàm
nhằm mục đích là hàm khởi tạo sẽ sử dụng liên kết toàn cục
cho giá trị của this
khi được gọi một cách độc lập:
function MyFunction() {
console.log( this );
}
const myObject = new MyFunction();
> MyFunction { }
MyFunction(); // Global `this` binding outside of strict mode is `globalThis`
> Window { … }
(function() {
"use strict";
function MyFunction() {
console.log( this );
}
MyFunction(); // Global `this` binding inside of strict mode is `undefined`
}());
> undefined
Thông thường, bạn nên viết hoa ký tự đầu tiên trong hàm khởi tạo
theo mẫu đặt tên do JavaScript tích hợp sẵn
hàm factory. Mặc dù đôi khi bạn có thể thấy các thuật ngữ được sử dụng thay thế cho nhau,
hàm khởi tạo – các hàm dùng để hoạt động trên hàm khởi tạo mới
đối tượng khi được gọi bằng từ khoá new
– khác với từ khoá "factory"
" return
rõ ràng
khi được gọi bình thường:
function myFunction( myArgument = false ) {
return { "myProperty" : myArgument };
}
const myObject = myFunction( true );
myObject;
> Object { myProperty: true }
Mặc dù các nguyên tắc cơ bản là như nhau, trường hợp sử dụng phương pháp tuỳ chỉnh hàm khởi tạo được cung cấp tốt hơn nhờ việc cung cấp đầy đủ tính năng hơn Cú pháp Class (Lớp) ra mắt trong ES6.