Symbol.species
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.
Thuộc tính dữ liệu tĩnh Symbol.species đại diện cho well-known symbol Symbol.species. Các phương thức tạo bản sao của một đối tượng có thể tra cứu symbol này trên đối tượng để tìm hàm constructor dùng khi tạo bản sao.
Warning:
Sự tồn tại của [Symbol.species] cho phép thực thi mã tùy ý và có thể tạo ra lỗ hổng bảo mật. Nó cũng làm cho một số tối ưu hóa trở nên khó hơn nhiều. Các nhà triển khai engine đang điều tra xem có nên bỏ tính năng này không. Tránh dựa vào nó nếu có thể.
Try it
class Array1 extends Array {
static get [Symbol.species]() {
return Array;
}
}
const a = new Array1(1, 2, 3);
const mapped = a.map((x) => x * x);
console.log(mapped instanceof Array1);
// Expected output: false
console.log(mapped instanceof Array);
// Expected output: true
Giá trị
Well-known symbol Symbol.species.
Property attributes of Symbol.species | |
|---|---|
| Writable | no |
| Enumerable | no |
| Configurable | no |
Mô tả
Thuộc tính accessor [Symbol.species] cho phép các lớp con ghi đè constructor mặc định cho các đối tượng. Nó chỉ định một giao thức về cách các instance nên được sao chép. Ví dụ, khi bạn dùng các phương thức sao chép mảng, như map(), phương thức map() dùng instance.constructor[Symbol.species] để lấy constructor để xây dựng mảng mới. Để biết thêm thông tin, xem subclassing built-ins.
Tất cả các triển khai tích hợp sẵn của [Symbol.species] đều trả về giá trị this, là constructor của instance hiện tại. Điều này cho phép các phương thức sao chép tạo các instance của lớp dẫn xuất thay vì lớp cơ sở — ví dụ, map() sẽ trả về một mảng cùng kiểu với mảng gốc.
Ví dụ
>Sử dụng species
Bạn có thể muốn trả về các đối tượng Array trong lớp mảng dẫn xuất MyArray. Ví dụ, khi dùng các phương thức như map() trả về constructor mặc định, bạn muốn các phương thức này trả về đối tượng Array cha, thay vì đối tượng MyArray. Symbol species cho phép bạn làm điều này:
class MyArray extends Array {
// Ghi đè species thành constructor Array cha
static get [Symbol.species]() {
return Array;
}
}
const a = new MyArray(1, 2, 3);
const mapped = a.map((x) => x * x);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
Đặc tả
| Thông số kỹ thuật |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.species> |