Spec-Zone.ru › JavaScript

Symbol.species

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.

Статическое свойство данных Symbol.species представляет собой общеизвестный символ Symbol.species. Методы, создающие копии объекта, могут искать этот символ на объекте, чтобы получить функцию-конструктор, которую следует использовать при создании копии.

Внимание: Существование [Symbol.species] позволяет выполнять произвольный код и может создавать уязвимости безопасности. Это также значительно затрудняет некоторые оптимизации. Разработчики движков исследуют возможность удаления этой функции. По возможности избегайте использования этой функции.

Попробовать

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

Значение

Общеизвестный символ Symbol.species.

Атрибуты свойства Symbol.species
Записываемое нет
Перечислимое нет
Конфигурируемое нет

Описание

Свойство-аксессор [Symbol.species] позволяет подклассам переопределять конструктор по умолчанию для объектов. Это определяет протокол того, как должны копироваться экземпляры. Например, когда вы используете методы копирования массивов, такие как map(), метод map() использует instance.constructor[Symbol.species], чтобы получить конструктор для создания нового массива. Для получения дополнительной информации см. создание подклассов встроенных объектов.

Все встроенные реализации [Symbol.species] возвращают значение this, которое является конструктором текущего экземпляра. Это позволяет методам копирования создавать экземпляры производных классов, а не базового класса. Например, map() вернет массив того же типа, что и исходный массив.

Примеры

Использование species

Возможно, вы захотите, чтобы ваш производный класс массива MyArray возвращал объекты Array. Например, при использовании методов, таких как map(), которые возвращают конструктор по умолчанию, вы хотите, чтобы эти методы возвращали родительский объект Array вместо объекта MyArray. Символ species позволяет вам сделать это:

class MyArray extends Array {
  // Overwrite species to the parent Array constructor
  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

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-symbol.species

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
species
51
13
41
38
10
51
41
41
10
5.0
51
10
1.0.0
1.0
6.5.0

См. также

  • Array[Symbol.species]
  • ArrayBuffer[Symbol.species]
  • Map[Symbol.species]
  • Promise[Symbol.species]
  • RegExp[Symbol.species]
  • Set[Symbol.species]
  • TypedArray[Symbol.species]

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API