RegExp[Symbol.species]

基线 广泛可用

此功能已非常成熟,并在许多设备和浏览器版本中运行良好。它自 2015 年 7 月.

报告反馈

RegExp[Symbol.species] 静态访问器属性返回在某些 RegExp 方法中用于构造复制正则表达式的构造函数。

试一试

语法

警告:[Symbol.species] 的存在允许执行任意代码,并可能造成安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在调查是否要移除此功能。如果可能,请避免依赖它。
RegExp[Symbol.species]

js

返回值

描述

调用 get [Symbol.species] 的构造函数 (this) 的值。返回值用于构造复制的 RegExp 实例。

警告:[Symbol.species] 的存在允许执行任意代码,并可能造成安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在调查是否要移除此功能。如果可能,请避免依赖它。
// Hypothetical underlying implementation for illustration
class RegExp {
  static get [Symbol.species]() {
    return this;
  }
}

[Symbol.species] 访问器属性返回 RegExp 对象的默认构造函数。子类构造函数可以覆盖它来更改构造函数分配。默认实现基本上是

警告:[Symbol.species] 的存在允许执行任意代码,并可能造成安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在调查是否要移除此功能。如果可能,请避免依赖它。
class SubRegExp extends SubRegExp {}
SubRegExp[Symbol.species] === SubRegExp; // true

由于这种多态实现,派生子类的 [Symbol.species] 默认也会返回构造函数本身。

示例

[Symbol.split]()

普通对象中的种类

警告:[Symbol.species] 的存在允许执行任意代码,并可能造成安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在调查是否要移除此功能。如果可能,请避免依赖它。
RegExp[Symbol.species]; // function RegExp()

[Symbol.species] 属性返回默认的构造函数,对于 RegExp 对象,它是 RegExp 构造函数

派生对象中的种类

警告:[Symbol.species] 的存在允许执行任意代码,并可能造成安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在调查是否要移除此功能。如果可能,请避免依赖它。
class MyRegExp extends RegExp {
  // Overwrite MyRegExp species to the parent RegExp constructor
  static get [Symbol.species]() {
    return RegExp;
  }
}

在自定义 RegExp 子类(例如 MyRegExp)的实例中,MyRegExp 种类是 MyRegExp 构造函数。但是,您可能希望覆盖它,以便在派生类方法中返回父 RegExp 对象

警告:[Symbol.species] 的存在允许执行任意代码,并可能造成安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在调查是否要移除此功能。如果可能,请避免依赖它。
class MyRegExp extends RegExp {
  constructor(...args) {
    console.log("Creating a new MyRegExp instance with args:", args);
    super(...args);
  }
  static get [Symbol.species]() {
    console.log("Copying MyRegExp");
    return this;
  }
  exec(value) {
    console.log("Executing with lastIndex:", this.lastIndex);
    return super.exec(value);
  }
}

Array.from("aabbccdd".matchAll(new MyRegExp("[ac]", "g")));
// Creating a new MyRegExp instance with args: [ '[ac]', 'g' ]
// Copying MyRegExp
// Creating a new MyRegExp instance with args: [ MyRegExp /[ac]/g, 'g' ]
// Executing with lastIndex: 0
// Executing with lastIndex: 1
// Executing with lastIndex: 2
// Executing with lastIndex: 5
// Executing with lastIndex: 6

规范

或者您可以使用它来观察复制过程
规范
# ECMAScript 语言规范

浏览器兼容性

sec-get-regexp-%symbol.species%

另请参阅