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 làm "hàm khởi tạo" cho đối tượng đó:

function MyFunction() {}
const myObject = new MyFunction();

typeof myObject;
> "object"`

Điều này cho phép "hàm khởi tạo" cung cấp 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 hàm khởi tạo đề cập đến đối tượng đang được tạo, cho phép điền 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 tạo các đố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 trên dữ liệu đó dưới dạng một đơn vị di động duy nhất, một khái niệm 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 ngữ cảnh thực thi hiện tại của một hàm, nghĩa là hàm khởi tạo tuân theo cùng các quy tắc về giá trị của this như mọi hàm khác. Ví dụ: một hàm dành làm hàm khởi tạo sẽ sử dụng tính năng liên kết chung cho giá trị của this khi được gọi độ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, cách viết hoa ký tự đầu tiên của giá trị nhận dạng hàm khởi tạo, theo mẫu đặt tên do các hàm gốc tích hợp của JavaScript thiết lập. Mặc dù đôi khi bạn có thể thấy các thuật ngữ được sử dụng thay thế cho nhau, nhưng hàm khởi tạo (các hàm khởi tạo có ý định hoạt động trên đối tượng mới được tạo khi được gọi bằng từ khoá new) khác với "hàm gốc" (rõ ràng return đối tượ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ù nguyên tắc cơ bản đều giống nhau, nhưng các trường hợp sử dụng các hàm khởi tạo tuỳ chỉnh sẽ phù hợp hơn với cú pháp Class (Lớp) đầy đủ tính năng hơn được giới thiệu trong ES6.