📅  最后修改于: 2023-12-03 15:31:39.330000             🧑  作者: Mango
在 ECMAScript 2015 (ES6) 中,typedArray.@@species
是所有 ArrayBuffer 带类型数组对象的属性,用于返回初始化传递到构造函数中的字节数组的构造函数。
实际上,它是一个可选的 getter
属性,它返回一个构造函数,该构造函数用于在创建新类型数组时确定要使用的构造函数。默认情况下,这是构造函数本身,但子类可以通过重写 @@species
属性来更改构造函数,这使得它成为继承的更强大工具。
下面是该属性的语法:
typedArray [Symbol.species]
让我们看一个示例,我们可以通过重写 @@species
属性来使用不同的构造函数来创建类型数组。首先,我们将创建一些 Uint8Arrays:
const arr1 = new Uint8Array([10, 20, 30]);
const arr2 = new Uint8Array([40, 50, 60]);
接下来,我们将创建一个新的 Uint16Array,该数组的值由上面的两个数组拼接而成:
const arr3 = Uint16Array.of(...arr1, ...arr2);
console.log(arr3); // Uint16Array [10, 20, 30, 40, 50, 60]
如上所示,我们使用了 Uint16Array.of
方法创建了一个新的 Uint16Array,该数组是由 arr1 和 arr2 数组拼接而成的。但是现在,让我们使用 @@species
属性来创建一个新的 Uint16Array,而不是使用 Uint16Array.of
来创建它。
我们首先创建一个名为 MyUint16Array
的子类,该类继承自 Uint16Array,然后重写 @@species
属性来返回自身的构造函数:
class MyUint16Array extends Uint16Array {
static get [Symbol.species]() {
return this;
}
}
现在,我们可以使用 MyUint16Array
类来创建一个新的 Uint16Array:
const arr4 = new MyUint16Array([...arr1, ...arr2]);
console.log(arr4); // MyUint16Array [10, 20, 30, 40, 50, 60]
如上所示,我们现在使用 const arr4 = new MyUint16Array([...arr1, ...arr2]);
来创建一个新的 Uint16Array。数组的构造函数是 MyUint16Array
,因为它是在子类中通过 @@species
返回的。
这就是 typedArray.@@species
的使用方式及其作为继承的强大工具的示例。
希望这篇介绍能帮助您更好地理解并应用这些概念!