RegExp[Symbol.species]
RegExp[Symbol.species] 静态访问器属性返回用于在某些 RegExp 方法中构造复制的正则表达式的构造函数。
¥The RegExp[Symbol.species] static accessor property returns the constructor used to construct copied regular expressions in certain RegExp methods.
警告:
[Symbol.species]的存在允许执行任意代码并可能产生安全漏洞。它还使某些优化变得更加困难。引擎实现者是 研究是否删除此功能。如果可能的话,避免依赖它。¥Warning: The existence of
[Symbol.species]allows execution of arbitrary code and may create security vulnerabilities. It also makes certain optimizations much harder. Engine implementers are investigating whether to remove this feature. Avoid relying on it if possible.
Try it
语法
返回值
描述
¥Description
[Symbol.species] 访问器属性返回 RegExp 对象的默认构造函数。子类构造函数可以重写它以更改构造函数赋值。默认实现基本上是:
¥The [Symbol.species] accessor property returns the default constructor for RegExp objects. Subclass constructors may override it to change the constructor assignment. The default implementation is basically:
// Hypothetical underlying implementation for illustration
class RegExp {
static get [Symbol.species]() {
return this;
}
}
由于这种多态实现,派生子类的 [Symbol.species] 也会默认返回构造函数本身。
¥Because of this polymorphic implementation, [Symbol.species] of derived subclasses would also return the constructor itself by default.
class SubRegExp extends SubRegExp {}
SubRegExp[Symbol.species] === SubRegExp; // true
某些 RegExp 方法会在运行 exec() 之前创建当前正则表达式实例的副本,以便不会保留对 lastIndex 的更改等副作用。[Symbol.species] 属性用于确定新实例的构造函数。复制当前正则表达式实例的方法是:
¥Some RegExp methods create a copy of the current regex instance before running exec(), so that side effects such as changes to lastIndex are not retained. The [Symbol.species] property is used to determine the constructor of the new instance. The methods that copy the current regex instance are:
示例
普通对象中的物种
派生对象中的物种
¥Species in derived objects
在自定义 RegExp 子类(例如 MyRegExp)的实例中,MyRegExp 种类是 MyRegExp 构造函数。但是,你可能想要覆盖它,以便在派生类方法中返回父 RegExp 对象:
¥In an instance of a custom RegExp subclass, such as MyRegExp, the MyRegExp species is the MyRegExp constructor. However, you might want to overwrite this, in order to return parent RegExp objects in your derived class methods:
class MyRegExp extends RegExp {
// Overwrite MyRegExp species to the parent RegExp constructor
static get [Symbol.species]() {
return RegExp;
}
}
或者你可以使用它来观察复制过程:
¥Or you can use this to observe the copying process:
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
规范
| Specification |
|---|
| ECMAScript Language Specification # sec-get-regexp-@@species |
浏览器兼容性
BCD tables only load in the browser
也可以看看
¥See also