Từ khóa mới

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.