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
Writableno
Enumerableno
Configurableno

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:

js
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

Tương thích trình duyệt

Xem thêm