Toán tử new

Class trong Javascript

Trong Javascript trước ES2015 không có từ khóa class tuy nhiên Javascript hổ trợ từ khóa new với function tương đương việc viết constructor của class và tạo object từ class trong các ngôn ngữ khác như Java/C#.

1
2
3
4
5
6
7
8
// tương đương khai báo constructor class Animal trong Java
function Animal(name) {
  this.name = name;
}

var pet = new Animal("Teddy");

console.log(pet); // Animal { name: "Teddy" }

Cơ bản thì this tương tự như this trong Java, new cũng tương đương với new, còn function thì tương đương với constructor trong Java. Tên class cũng chính là tên hàm Animal.

Toán tử new

Trong ví dụ trên, khi gọi toán tử new thì Javascript sẽ tạo ra một đối tượng. Đối tượng này sẽ thừa kế Animal.prototype và thực thi hàm khởi tạo (contructor), cũng chính là hàm Animal với từ khóa this trỏ đến đối tượng vừa tạo ra. Sau đó trả về đối tượng đó.

Ví dụ sau sẽ tương đương với ví dụ trước nhưng không dùng toán tử new.

1
2
3
4
5
6
7
8
9
function Animal(name) {
  this.name = name;
}

var pet = {}; // tạo đối tượng mới
pet.__proto__ = Animal.prototype; // thừa kế từ Animal.prototype
Animal.bind(pet)("Teddy"); // gọi hàm constructor, bind this là pet

console.log(pet); // Animal { name: "Teddy" }

Thuộc tính prototype

Khi tạo một hàm, hàm đó có thêm một thuộc tính là prototype là một object thừa kế Object.prototype.

1
2
3
4
5
function Animal(name) {
  this.name = name;
}
console.log(typeof Animal.prototype); // object
console.log(Animal.prototype.__proto__ === Object.prototype); // true

Object.prototype là một object không có cha (thừa kế từ null) và có các hàm tạo sẵn như toString, isPrototypeOf, hasOwnProperty. Mọi đối tượng đều thừa kế từ Object.prototype này.

1
2
3
console.log(Object.prototype.__proto__); // null
console.log(typeof Object.prototype.toString); // function
console.log(typeof Object.prototype.hasOwnProperty); // function

Ngoài ra Animal.prototype còn có một thuộc tính là contructor trỏ đến chính hàm Animal.

1
2
3
4
function Animal(name) {
  this.name = name;
}
console.log(Animal.prototype.contructor === Animal); // true

Kết luận như sau:

object pet <–thừa kế– Animal.prototype <–thừa kế– Object prototype
object pet <–constructor– Animal()