Làm cách nào để gọi hàm tạo javascript?

Cú pháp

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
0 thông thường cho phép chúng ta tạo một đối tượng. Nhưng thường thì chúng ta cần tạo nhiều đối tượng tương tự, như nhiều người dùng hoặc mục menu, v.v.

Điều đó có thể được thực hiện bằng cách sử dụng hàm tạo và toán tử

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
1

Các hàm xây dựng về mặt kỹ thuật là các hàm thông thường. Có hai quy ước mặc dù

  1. Họ được đặt tên với chữ in hoa đầu tiên
  2. Chúng chỉ nên được thực thi với toán tử
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    1

Ví dụ

function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User("Jack");

alert(user.name); // Jack
alert(user.isAdmin); // false

Khi một hàm được thực thi với

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3, nó sẽ thực hiện các bước sau

  1. Một đối tượng trống mới được tạo và gán cho
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    4
  2. Thân hàm thực thi. Thông thường, nó sửa đổi
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    4, thêm các thuộc tính mới vào nó
  3. Giá trị của
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    4 được trả về

Nói cách khác,

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
7 làm điều gì đó giống như

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}

Vì vậy,

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
8 cho kết quả tương tự như

let user = {
  name: "Jack",
  isAdmin: false
};

Bây giờ nếu chúng tôi muốn tạo những người dùng khác, chúng tôi có thể gọi

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
9,
let user = {
  name: "Jack",
  isAdmin: false
};
0, v.v. Ngắn hơn nhiều so với sử dụng chữ mỗi lần và cũng dễ đọc

Đó là mục đích chính của các nhà xây dựng - để triển khai mã tạo đối tượng có thể tái sử dụng

Hãy lưu ý một lần nữa – về mặt kỹ thuật, bất kỳ hàm nào (ngoại trừ hàm mũi tên, vì chúng không có

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
4) đều có thể được sử dụng làm hàm tạo. Nó có thể được chạy với
function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3 và nó sẽ thực hiện thuật toán trên. “Chữ viết hoa trước” là một thỏa thuận phổ biến, để làm rõ rằng một chức năng sẽ được chạy với
function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3

hàm mới() { … }

Nếu chúng ta có nhiều dòng mã về việc tạo một đối tượng phức tạp duy nhất, chúng ta có thể bọc chúng trong một hàm xây dựng được gọi ngay lập tức, như thế này

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};

Hàm tạo này không thể được gọi lại vì nó không được lưu ở bất kỳ đâu, chỉ được tạo và gọi. Vì vậy, thủ thuật này nhằm mục đích đóng gói mã xây dựng một đối tượng mà không sử dụng lại trong tương lai

Nội dung nâng cao

Cú pháp từ phần này hiếm khi được sử dụng, hãy bỏ qua trừ khi bạn muốn biết mọi thứ

Bên trong một hàm, chúng ta có thể kiểm tra xem nó có được gọi với

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3 hay không, bằng cách sử dụng một thuộc tính đặc biệt
let user = {
  name: "Jack",
  isAdmin: false
};
5

Nó không được xác định cho các cuộc gọi thông thường và bằng chức năng nếu được gọi với

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3

function User() {
  alert(new.target);
}

// without "new":
User(); // undefined

// with "new":
new User(); // function User { .. }

Điều đó có thể được sử dụng bên trong hàm để biết liệu nó được gọi với

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3, “ở chế độ hàm tạo” hay không, “ở chế độ thông thường”

Chúng tôi cũng có thể thực hiện cả cuộc gọi

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3 và thông thường để làm điều tương tự, như thế này

function User(name) {
  if (!new.target) { // if you run me without new
    return new User(name); // ...I will add new for you
  }

  this.name = name;
}

let john = User("John"); // redirects call to new User
alert(john.name); // John

Cách tiếp cận này đôi khi được sử dụng trong các thư viện để làm cho cú pháp linh hoạt hơn. Để mọi người có thể gọi hàm có hoặc không có

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3, và nó vẫn hoạt động

Tuy nhiên, có lẽ không phải là một điều tốt để sử dụng ở mọi nơi, bởi vì việc bỏ qua

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3 làm cho nó ít rõ ràng hơn về những gì đang diễn ra. Với
function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3 chúng ta đều biết rằng đối tượng mới đang được tạo

Thông thường, hàm tạo không có câu lệnh

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};
2. Nhiệm vụ của họ là viết tất cả những thứ cần thiết vào
function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
4, và nó tự động trở thành kết quả

Nhưng nếu có một câu lệnh

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};
2, thì quy tắc rất đơn giản

  • Nếu
    // create a function and immediately call it with new
    let user = new function() {
      this.name = "John";
      this.isAdmin = false;
    
      // ...other code for user creation
      // maybe complex logic and statements
      // local variables etc
    };
    2 được gọi với một đối tượng, thì đối tượng đó sẽ được trả về thay vì
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    4
  • Nếu
    // create a function and immediately call it with new
    let user = new function() {
      this.name = "John";
      this.isAdmin = false;
    
      // ...other code for user creation
      // maybe complex logic and statements
      // local variables etc
    };
    2 được gọi với số nguyên thủy, nó sẽ bị bỏ qua

Nói cách khác,

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};
2 với một đối tượng trả về đối tượng đó, trong tất cả các trường hợp khác,
function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
4 được trả về

Chẳng hạn, ở đây

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};
2 ghi đè
function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
4 bằng cách trả về một đối tượng

function BigUser() {

  this.name = "John";

  return { name: "Godzilla" };  // <-- returns this object
}

alert( new BigUser().name );  // Godzilla, got that object

Và đây là một ví dụ với một

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};
2 trống (hoặc chúng ta có thể đặt một số nguyên thủy sau nó, không thành vấn đề)

function SmallUser() {

  this.name = "John";

  return; // <-- returns this
}

alert( new SmallUser().name );  // John

Thông thường các nhà xây dựng không có câu lệnh

// create a function and immediately call it with new
let user = new function() {
  this.name = "John";
  this.isAdmin = false;

  // ...other code for user creation
  // maybe complex logic and statements
  // local variables etc
};
2. Ở đây chúng tôi đề cập đến hành vi đặc biệt với các đối tượng trả về chủ yếu vì mục đích hoàn thiện

Bỏ qua dấu ngoặc đơn

Nhân tiện, chúng ta có thể bỏ qua dấu ngoặc đơn sau

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
3

let user = new User; // <-- no parentheses
// same as
let user = new User();

Bỏ qua dấu ngoặc đơn ở đây không được coi là "phong cách tốt", nhưng cú pháp được cho phép theo đặc điểm kỹ thuật

Sử dụng các hàm xây dựng để tạo các đối tượng mang lại rất nhiều tính linh hoạt. Hàm xây dựng có thể có các tham số xác định cách xây dựng đối tượng và những gì cần đặt trong đó

Tất nhiên, chúng ta có thể thêm vào

function User(name) {
  // this = {};  (implicitly)

  // add properties to this
  this.name = name;
  this.isAdmin = false;

  // return this;  (implicitly)
}
4 không chỉ các thuộc tính mà cả các phương thức

Chẳng hạn,

function User() {
  alert(new.target);
}

// without "new":
User(); // undefined

// with "new":
new User(); // function User { .. }
6 bên dưới tạo một đối tượng với
function User() {
  alert(new.target);
}

// without "new":
User(); // undefined

// with "new":
new User(); // function User { .. }
7 đã cho và phương thức
function User() {
  alert(new.target);
}

// without "new":
User(); // undefined

// with "new":
new User(); // function User { .. }
8

function User(name) {
  this.name = name;

  this.sayHi = function() {
    alert( "My name is: " + this.name );
  };
}

let john = new User("John");

john.sayHi(); // My name is: John

/*
john = {
   name: "John",
   sayHi: function() { .. }
}
*/

Để tạo các đối tượng phức tạp, có một cú pháp nâng cao hơn, các lớp, mà chúng ta sẽ đề cập sau

  • Các hàm xây dựng hay ngắn gọn là các hàm tạo là các hàm thông thường, nhưng có một thỏa thuận chung là đặt tên chúng bằng chữ in hoa trước
  • Hàm xây dựng chỉ nên được gọi bằng cách sử dụng
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    3. Một cuộc gọi như vậy ngụ ý tạo ra một
    function User(name) {
      // this = {};  (implicitly)
    
      // add properties to this
      this.name = name;
      this.isAdmin = false;
    
      // return this;  (implicitly)
    }
    4 trống ở đầu và trả về một cái đã điền ở cuối

Chúng ta có thể sử dụng các hàm tạo để tạo nhiều đối tượng giống nhau

JavaScript cung cấp các hàm tạo cho nhiều đối tượng ngôn ngữ tích hợp. như

function User(name) {
  if (!new.target) { // if you run me without new
    return new User(name); // ...I will add new for you
  }

  this.name = name;
}

let john = User("John"); // redirects call to new User
alert(john.name); // John
1 cho ngày tháng,
function User(name) {
  if (!new.target) { // if you run me without new
    return new User(name); // ...I will add new for you
  }

  this.name = name;
}

let john = User("John"); // redirects call to new User
alert(john.name); // John
2 cho bộ và những thứ khác mà chúng tôi dự định học

Đối tượng, chúng tôi sẽ trở lại

Trong chương này chúng ta chỉ trình bày những kiến ​​thức cơ bản về đối tượng và hàm tạo. Chúng rất cần thiết để tìm hiểu thêm về các kiểu dữ liệu và chức năng trong các chương tiếp theo

Sau khi biết điều đó, chúng ta quay lại các đối tượng và tìm hiểu sâu hơn về chúng trong các chương Nguyên mẫu, kế thừa và Lớp

Làm cách nào để gọi hàm tạo trong JavaScript?

Constructor là một hàm đặc biệt dùng để tạo và khởi tạo một thể hiện đối tượng của một lớp. Trong JavaScript, hàm tạo được gọi khi một đối tượng được tạo bằng từ khóa mới . Mục đích của hàm tạo là tạo đối tượng mới và đặt giá trị cho bất kỳ thuộc tính đối tượng hiện có nào.

Toán tử nào được sử dụng để gọi hàm tạo?

Hàm xây dựng . "new" operator.

Gọi hàm tạo có nghĩa là gì?

Việc gọi một hàm tạo xây dựng một đối tượng mới của lớp mà hàm tạo thuộc về và trả về một tham chiếu đến đối tượng đã tạo . Đối tượng được xây dựng bằng cách sử dụng các tham số được truyền cho hàm tạo.

Hàm tạo có được gọi tự động không?

Constructor trong C++ là một phương thức đặc biệt được gọi tự động tại thời điểm tạo đối tượng . Nó được sử dụng để khởi tạo các thành viên dữ liệu của các đối tượng mới nói chung. Hàm tạo trong C++ có cùng tên với lớp hoặc cấu trúc.