Generator
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Đối tượng Generator được trả về bởi hàm generator và nó tuân theo cả giao thức iterable lẫn giao thức iterator.
Generator là lớp con của lớp Iterator.
Constructor
Không có thực thể JavaScript nào tương ứng với constructor Generator. Các instance của Generator phải được trả về từ hàm generator:
function* generator() {
yield 1;
yield 2;
yield 3;
}
const gen = generator(); // "Generator { }"
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
Chỉ có một đối tượng ẩn là đối tượng prototype được chia sẻ bởi tất cả các đối tượng được tạo bởi hàm generator. Đối tượng này thường được ký hiệu là Generator.prototype để trông giống lớp, nhưng nên được gọi chính xác hơn là GeneratorFunction.prototype.prototype, vì GeneratorFunction là một thực thể JavaScript thực sự. Để hiểu chuỗi prototype của các instance Generator, xem GeneratorFunction.prototype.prototype.
Thuộc tính instance
Các thuộc tính này được định nghĩa trên Generator.prototype và được chia sẻ bởi tất cả các instance Generator.
Generator.prototype.constructor-
Hàm constructor đã tạo đối tượng instance. Đối với các instance
Generator, giá trị khởi tạo làGeneratorFunction.prototype.Note: Các đối tượng
Generatorkhông lưu trữ tham chiếu đến hàm generator đã tạo ra chúng. Generator.prototype[Symbol.toStringTag]-
Giá trị khởi tạo của thuộc tính
[Symbol.toStringTag]là chuỗi"Generator". Thuộc tính này được dùng trongObject.prototype.toString().
Phương thức instance
Cũng kế thừa các phương thức instance từ lớp cha Iterator.
Generator.prototype.next()-
Trả về giá trị được tạo ra bởi biểu thức
yield. Generator.prototype.return()-
Hoạt động như thể câu lệnh
returnđược chèn vào thân generator tại vị trí đang tạm dừng hiện tại, kết thúc generator và cho phép generator thực hiện các tác vụ dọn dẹp khi kết hợp với khốitry...finally. Generator.prototype.throw()-
Hoạt động như thể câu lệnh
throwđược chèn vào thân generator tại vị trí đang tạm dừng hiện tại, thông báo cho generator về điều kiện lỗi và cho phép nó xử lý lỗi, hoặc thực hiện dọn dẹp và tự đóng lại.
Ví dụ
>Iterator vô hạn
Với hàm generator, các giá trị không được đánh giá cho đến khi chúng cần. Do đó, generator cho phép chúng ta định nghĩa cấu trúc dữ liệu có tiềm năng vô hạn.
function* infinite() {
let index = 0;
while (true) {
yield index++;
}
}
const generator = infinite(); // "Generator { }"
console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// …
Đặc tả kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-generator-objects> |