Hướng dẫn can you create class in javascript? - bạn có thể tạo lớp học trong javascript không?

Ecmascript 2015, còn được gọi là ES6, đã giới thiệu các lớp JavaScript.

Show

Các lớp JavaScript là các mẫu cho các đối tượng JavaScript.

Cú pháp lớp JavaScript

Sử dụng từ khóa

const p = new Rectangle(); // ReferenceError

class Rectangle {}
8 để tạo một lớp.

Luôn thêm một phương thức có tên

const p = new Rectangle(); // ReferenceError

class Rectangle {}
9:

Cú pháp

lớp lớp {& nbsp; người xây dựng() { ... } }
  constructor() { ... }
}

Thí dụ

Lớp xe {& nbsp; constructor (tên, năm) {& nbsp; & nbsp; & nbsp; this.name = name; & nbsp; & nbsp; & nbsp; this.year = năm; & nbsp; }}
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
}

Ví dụ trên tạo ra một lớp có tên là "xe".

Lớp có hai thuộc tính ban đầu: "Tên" và "Năm".

Một lớp JavaScript không phải là một đối tượng.not an object.

Nó là một mẫu cho các đối tượng JavaScript.template for JavaScript objects.


Sử dụng một lớp học

Khi bạn có một lớp, bạn có thể sử dụng lớp để tạo đối tượng:

Thí dụ

Lớp xe {& nbsp; constructor (tên, năm) {& nbsp; & nbsp; & nbsp; this.name = name; & nbsp; & nbsp; & nbsp; this.year = năm; & nbsp; }}
let myCar2 = new Car("Audi", 2019);

Ví dụ trên tạo ra một lớp có tên là "xe".

Lớp có hai thuộc tính ban đầu: "Tên" và "Năm".Car class to create two Car objects.

Một lớp JavaScript không phải là một đối tượng.


Nó là một mẫu cho các đối tượng JavaScript.

Sử dụng một lớp học

  • Khi bạn có một lớp, bạn có thể sử dụng lớp để tạo đối tượng:
  • Hãy để mycar1 = xe mới ("Ford", 2014); Hãy để mycar2 = xe mới ("Audi", 2019);
  • Hãy tự mình thử »

Ví dụ trên sử dụng lớp xe để tạo hai đối tượng xe.



Phương thức cấu trúc được gọi tự động khi một đối tượng mới được tạo.

Phương pháp tạo hàm

Sử dụng từ khóa

const p = new Rectangle(); // ReferenceError

class Rectangle {}
8 để tạo một lớp.

Luôn thêm một phương thức có tên

const p = new Rectangle(); // ReferenceError

class Rectangle {}
9:

Cú pháp

Cú pháp

lớp lớp {& nbsp; người xây dựng() { ... } }
  constructor() { ... }
  method_1() { ... }
  method_2() { ... }
  method_3() { ... }
}

Thí dụ

Thí dụ

Lớp xe {& nbsp; constructor (tên, năm) {& nbsp; & nbsp; & nbsp; this.name = name; & nbsp; & nbsp; & nbsp; this.year = năm; & nbsp; }}
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
  age() {
    let date = new Date();
    return date.getFullYear() - this.year;
  }
}

Ví dụ trên tạo ra một lớp có tên là "xe".
document.getElementById("demo").innerHTML =
"My car is " + myCar.age() + " years old.";

Ví dụ trên tạo ra một lớp có tên là "xe".

Lớp có hai thuộc tính ban đầu: "Tên" và "Năm".

Thí dụ

Lớp xe {& nbsp; constructor (tên, năm) {& nbsp; & nbsp; & nbsp; this.name = name; & nbsp; & nbsp; & nbsp; this.year = năm; & nbsp; }}
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
  age(x) {
    return x - this.year;
  }
}

Ví dụ trên tạo ra một lớp có tên là "xe".
let year = date.getFullYear();

Lớp có hai thuộc tính ban đầu: "Tên" và "Năm".
document.getElementById("demo").innerHTML=
"My car is " + myCar.age(year) + " years old.";

Ví dụ trên tạo ra một lớp có tên là "xe".


Lớp có hai thuộc tính ban đầu: "Tên" và "Năm".

Một lớp JavaScript không phải là một đối tượng.

Nó là một mẫu cho các đối tượng JavaScript.Sử dụng một lớp họcKhi bạn có một lớp, bạn có thể sử dụng lớp để tạo đối tượng: Hãy để mycar1 = xe mới ("Ford", 2014); Hãy để mycar2 = xe mới ("Audi", 2019); Hãy tự mình thử »
Ví dụ trên sử dụng lớp xe để tạo hai đối tượng xe.Phương thức cấu trúc được gọi tự động khi một đối tượng mới được tạo.Ví dụ trên sử dụng lớp xe để tạo hai đối tượng xe.Phương thức cấu trúc được gọi tự động khi một đối tượng mới được tạo.Ví dụ trên sử dụng lớp xe để tạo hai đối tượng xe.

Phương thức cấu trúc được gọi tự động khi một đối tượng mới được tạo.



Các lớp là một mẫu để tạo đối tượng. Họ gói gọn dữ liệu với mã để làm việc trên dữ liệu đó. Các lớp trong JS được xây dựng trên các nguyên mẫu nhưng cũng có một số cú pháp và ngữ nghĩa không được chia sẻ với ngữ nghĩa giống như lớp ES5.

Xác định các lớp học

Trên thực tế, các lớp là "các hàm đặc biệt" và giống như bạn có thể xác định các biểu thức chức năng và khai báo chức năng, cú pháp lớp có hai thành phần: biểu thức lớp và khai báo lớp.

Tuyên bố lớp học

Một cách để xác định một lớp là sử dụng khai báo lớp. Để khai báo một lớp, bạn sử dụng từ khóa

const p = new Rectangle(); // ReferenceError

class Rectangle {}
8 với tên của lớp ("hình chữ nhật" ở đây).class declaration. To declare a class, you use the
const p = new Rectangle(); // ReferenceError

class Rectangle {}
8 keyword with the name of the class ("Rectangle" here).

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

Kéo

Một sự khác biệt quan trọng giữa khai báo chức năng và khai báo lớp là trong khi các hàm có thể được gọi trong mã xuất hiện trước khi chúng được xác định, các lớp phải được xác định trước khi chúng có thể được xây dựng. Mã như sau sẽ ném

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
3:function declarations and class declarations is that while functions can be called in code that appears before they are defined, classes must be defined before they can be constructed. Code like the following will throw a
// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
3:

const p = new Rectangle(); // ReferenceError

class Rectangle {}

Điều này xảy ra bởi vì trong khi lớp được nâng các giá trị của nó không được khởi tạo.

Biểu thức lớp học

Một biểu thức lớp là một cách khác để xác định một lớp. Biểu thức lớp có thể được đặt tên hoặc không tên. Tên được đặt cho một biểu thức lớp được đặt tên là cục bộ với cơ thể của lớp. Tuy nhiên, nó có thể được truy cập thông qua thuộc tính

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
4.class expression is another way to define a class. Class expressions can be named or unnamed. The name given to a named class expression is local to the class's body. However, it can be accessed via the
// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
4 property.

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"

LƯU Ý: Các biểu thức lớp phải được khai báo trước khi chúng có thể được sử dụng (chúng phải tuân theo các hạn chế kéo tương tự như được mô tả trong phần khai báo lớp). Class expressions must be declared before they can be used (they are subject to the same hoisting restrictions as described in the class declarations section).

Định nghĩa cơ thể và phương pháp

Cơ thể của một lớp là phần trong ngoặc xoăn

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
5. Đây là nơi bạn xác định các thành viên lớp, chẳng hạn như phương thức hoặc hàm tạo.

Chế độ nghiêm ngặt

Cơ thể của một lớp được thực thi ở chế độ nghiêm ngặt, tức là, mã được viết ở đây phải chịu cú pháp nghiêm ngặt hơn để tăng hiệu suất, một số lỗi im lặng sẽ được ném và một số từ khóa được dành cho các phiên bản trong tương lai của Ecmascript.

Người xây dựng

Phương thức Constructor là một phương thức đặc biệt để tạo và khởi tạo một đối tượng được tạo bằng

const p = new Rectangle(); // ReferenceError

class Rectangle {}
8. Chỉ có thể có một phương pháp đặc biệt với tên "Constructor" trong một lớp. Một
// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
7 sẽ được ném nếu lớp chứa nhiều hơn một lần xuất hiện của phương pháp
// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
8.

Một hàm tạo có thể sử dụng từ khóa

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
9 để gọi hàm tạo của siêu lớp.

Khối khởi tạo tĩnh

Các khối khởi tạo tĩnh cho phép khởi tạo linh hoạt các thuộc tính tĩnh bao gồm cả việc đánh giá các câu lệnh trong quá trình khởi tạo và cấp quyền truy cập vào phạm vi riêng.

Nhiều khối tĩnh có thể được khai báo và chúng có thể được xen kẽ với khai báo các thuộc tính và phương thức tĩnh (tất cả các mục tĩnh được đánh giá theo thứ tự khai báo).

Phương pháp nguyên mẫu

Xem thêm Định nghĩa phương pháp.

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100

Phương pháp máy phát điện

Xem thêm Trình lặp và máy phát điện.

class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]

Phương pháp và tính chất tĩnh

Từ khóa tĩnh xác định một phương thức hoặc thuộc tính tĩnh cho một lớp. Các thành viên tĩnh (thuộc tính và phương thức) được gọi mà không cần khởi tạo lớp của họ và không thể được gọi thông qua một thể hiện lớp. Các phương thức tĩnh thường được sử dụng để tạo các chức năng tiện ích cho một ứng dụng, trong khi các thuộc tính tĩnh rất hữu ích cho bộ đệm, cấu hình cố định hoặc bất kỳ dữ liệu nào khác mà bạn không cần phải được sao chép trên các trường hợp.cannot be called through a class instance. Static methods are often used to create utility functions for an application, whereas static properties are useful for caches, fixed-configuration, or any other data you don't need to be replicated across instances.

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static displayName = "Point";
  static distance(a, b) {
    const dx = a.x - b.x;
    const dy = a.y - b.y;

    return Math.hypot(dx, dy);
  }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance;    // undefined
p2.displayName; // undefined
p2.distance;    // undefined

console.log(Point.displayName);      // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755

Liên kết class Rectangle { constructor(height, width) { this.height = height; this.width = width; } // Getter get area() { return this.calcArea(); } // Method calcArea() { return this.height * this.width; } } const square = new Rectangle(10, 10); console.log(square.area); // 100 0 với phương pháp nguyên mẫu và tĩnh

Khi phương thức tĩnh hoặc nguyên mẫu được gọi mà không có giá trị cho

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
0, chẳng hạn như bằng cách gán phương thức cho một biến và sau đó gọi nó, giá trị
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
0 sẽ là
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
3 bên trong phương thức. Hành vi này sẽ giống nhau ngay cả khi chỉ thị
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
4 không có mặt, bởi vì mã trong ranh giới cú pháp của cơ thể
const p = new Rectangle(); // ReferenceError

class Rectangle {}
8 luôn được thực thi ở chế độ nghiêm ngặt.

class Animal {
  speak() {
    return this;
  }
  static eat() {
    return this;
  }
}

const obj = new Animal();
obj.speak(); // the Animal object
const speak = obj.speak;
speak(); // undefined

Animal.eat() // class Animal
const eat = Animal.eat;
eat(); // undefined

Nếu chúng ta viết lại ở trên bằng cách sử dụng cú pháp dựa trên chức năng truyền thống ở chế độ không đóng cửa, thì các cuộc gọi phương thức

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
0 sẽ tự động bị ràng buộc với giá trị
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
0 ban đầu, theo mặc định là đối tượng toàn cầu. Trong chế độ nghiêm ngặt, tự động hóa sẽ không xảy ra; Giá trị của
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
0 vẫn được thông qua.

function Animal() { }

Animal.prototype.speak = function () {
  return this;
}

Animal.eat = function () {
  return this;
}

const obj = new Animal();
const speak = obj.speak;
speak(); // global object (in non–strict mode)

const eat = Animal.eat;
eat(); // global object (in non-strict mode)

Thuộc tính thể hiện

Thuộc tính thể hiện phải được xác định bên trong các phương thức lớp:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

Tuyên bố thực địa

Tuyên bố lĩnh vực công cộng

Với cú pháp khai báo trường JavaScript, ví dụ trên có thể được viết là:

class Rectangle {
  height = 0;
  width;
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

Chúng tôi không cần các từ khóa như

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100
9,
class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
0 hoặc
class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
1 để khai báo các trường.

Bằng cách tuyên bố các trường trước, các định nghĩa lớp trở nên tự ghi chép hơn và các trường luôn luôn có mặt.

Như đã thấy ở trên, các trường có thể được khai báo có hoặc không có giá trị mặc định.

Xem các trường lớp công cộng để biết thêm thông tin.

Tuyên bố lĩnh vực tư nhân

Sử dụng các trường riêng, định nghĩa có thể được tinh chỉnh như dưới đây.

const p = new Rectangle(); // ReferenceError

class Rectangle {}
0

Đó là một lỗi để tham khảo các trường riêng từ bên ngoài lớp; Chúng chỉ có thể được đọc hoặc viết trong cơ thể lớp. Bằng cách xác định những thứ không hiển thị bên ngoài lớp, bạn đảm bảo rằng người dùng của lớp bạn không thể phụ thuộc vào nội bộ, có thể thay đổi từ phiên bản này sang phiên bản khác.

LƯU Ý: Các trường riêng chỉ có thể được khai báo về phía trước trong khai báo trường. Private fields can only be declared up-front in a field declaration.

Các trường riêng không thể được tạo sau đó thông qua việc gán cho chúng, cách mà các thuộc tính bình thường có thể.

Để biết thêm thông tin, hãy xem các tính năng của lớp riêng.

Phân loại phụ với class Polygon { constructor(...sides) { this.sides = sides; } // Method *getSides() { for (const side of this.sides) { yield side; } } } const pentagon = new Polygon(1,2,3,4,5); console.log([...pentagon.getSides()]); // [1,2,3,4,5] 2

Từ khóa

class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
2 được sử dụng trong các khai báo lớp hoặc biểu thức lớp để tạo một lớp như một đứa trẻ của một lớp khác.

const p = new Rectangle(); // ReferenceError

class Rectangle {}
1

Nếu có một hàm tạo có trong lớp con, trước tiên nó cần gọi Super () trước khi sử dụng "This".

Người ta cũng có thể mở rộng các "lớp" dựa trên chức năng truyền thống:

const p = new Rectangle(); // ReferenceError

class Rectangle {}
2

Lưu ý rằng các lớp không thể mở rộng các đối tượng thường xuyên (không thể xây dựng). Nếu bạn muốn kế thừa từ một đối tượng thông thường, thay vào đó bạn có thể sử dụng

class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
4:

const p = new Rectangle(); // ReferenceError

class Rectangle {}
3

Loài

Bạn có thể muốn trả về các đối tượng

class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
5 trong lớp mảng xuất phát của bạn
class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
6. Mô hình loài cho phép bạn ghi đè các nhà xây dựng mặc định.

Ví dụ: khi sử dụng các phương thức như

class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
7 trả về hàm tạo mặc định, bạn muốn các phương thức này trả về đối tượng cha mẹ
class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
5, thay vì đối tượng
class Polygon {
  constructor(...sides) {
    this.sides = sides;
  }
  // Method
  *getSides() {
    for (const side of this.sides) {
      yield side;
    }
  }
}

const pentagon = new Polygon(1,2,3,4,5);

console.log([...pentagon.getSides()]); // [1,2,3,4,5]
6. Biểu tượng
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static displayName = "Point";
  static distance(a, b) {
    const dx = a.x - b.x;
    const dy = a.y - b.y;

    return Math.hypot(dx, dy);
  }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance;    // undefined
p2.displayName; // undefined
p2.distance;    // undefined

console.log(Point.displayName);      // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
0 cho phép bạn làm điều này:

const p = new Rectangle(); // ReferenceError

class Rectangle {}
4

Các cuộc gọi siêu lớp với // unnamed let Rectangle = class { constructor(height, width) { this.height = height; this.width = width; } }; console.log(Rectangle.name); // "Rectangle" // named Rectangle = class Rectangle2 { constructor(height, width) { this.height = height; this.width = width; } }; console.log(Rectangle.name); // "Rectangle2" 9

Từ khóa

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
9 được sử dụng để gọi các phương thức tương ứng của siêu lớp. Đây là một lợi thế so với kế thừa dựa trên nguyên mẫu.

const p = new Rectangle(); // ReferenceError

class Rectangle {}
5

Mix-ins

Tóm tắt các lớp con hoặc hỗn hợp là các mẫu cho các lớp. Một lớp Ecmascript chỉ có thể có một siêu lớp duy nhất, do đó, nhiều kế thừa từ các lớp công cụ, chẳng hạn, là không thể. Các chức năng phải được cung cấp bởi siêu lớp.

Một chức năng có siêu lớp dưới dạng đầu vào và lớp con mở rộng siêu lớp đó làm đầu ra có thể được sử dụng để thực hiện các bản phối trong ecmascript:

const p = new Rectangle(); // ReferenceError

class Rectangle {}
6

Một lớp sử dụng các bản phối này sau đó có thể được viết như thế này:

const p = new Rectangle(); // ReferenceError

class Rectangle {}
7

Chạy lại một định nghĩa lớp học

Một lớp học không thể được xác định lại. Cố gắng làm như vậy tạo ra một

// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle"

// named
Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name); // "Rectangle2"
7.

Nếu bạn đang thử nghiệm mã trong trình duyệt web, chẳng hạn như bảng điều khiển web Firefox (Công cụ> Nhà phát triển web> Bảng điều khiển web) và bạn 'chạy' định nghĩa về một lớp có cùng tên hai lần, bạn sẽ nhận được

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static displayName = "Point";
  static distance(a, b) {
    const dx = a.x - b.x;
    const dy = a.y - b.y;

    return Math.hypot(dx, dy);
  }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance;    // undefined
p2.displayName; // undefined
p2.distance;    // undefined

console.log(Point.displayName);      // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
4. .Tools > Web Developer > Web Console) and you 'Run' a definition of a class with the same name twice, you'll get a
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static displayName = "Point";
  static distance(a, b) {
    const dx = a.x - b.x;
    const dy = a.y - b.y;

    return Math.hypot(dx, dy);
  }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance;    // undefined
p2.displayName; // undefined
p2.distance;    // undefined

console.log(Point.displayName);      // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
4. (See further discussion of this issue in bug 1428672.) Doing something similar in Chrome Developer Tools gives you a message like
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static displayName = "Point";
  static distance(a, b) {
    const dx = a.x - b.x;
    const dy = a.y - b.y;

    return Math.hypot(dx, dy);
  }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance;    // undefined
p2.displayName; // undefined
p2.distance;    // undefined

console.log(Point.displayName);      // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
5.

Thông số kỹ thuật

Sự chỉ rõ
Đặc tả ngôn ngữ Ecmascript # Sec-Class-Deellitions
# sec-class-definitions

Tính tương thích của trình duyệt web

Bảng BCD chỉ tải trong trình duyệt

Xem thêm

Tại sao lớp không được sử dụng trong JavaScript?

Các đối tượng được xác định với các lớp phải sử dụng từ khóa 'này'.Nếu bạn chuyển phương thức lớp của mình cho một cuộc gọi lại, bạn có thể gặp các vấn đề ràng buộc.Đây là lý do tại sao bạn sẽ thấy rất nhiều mã trong đó phương thức phải được ràng buộc với bối cảnh chính xác.. If you pass your class method to a callback, you can run into binding issues. This is why you will see a lot of code where the method has to be bound to the correct context.

Các lớp học có tốt để sử dụng trong JavaScript không?

Trong JavaScript, bạn không!Bạn có thể viết bất kỳ chương trình nào bạn muốn mà không cần sử dụng các lớp học hoặc từ khóa này!Thật vậy, cú pháp lớp có phần mới đối với JavaScript và mã định hướng đối tượng đã được viết với các chức năng trước.Cú pháp lớp chỉ là đường cú pháp so với cách tiếp cận dựa trên chức năng đó với OOP.you don't! You can write any program you want without utilizing classes or the this keyword ever! Indeed, the class syntax is somewhat new to JavaScript, and object oriented code was written with functions beforehand. The class syntax is just syntactic sugar over that function-based approach to OOP.