📜  JavaScript | typedArray.@@species 与示例(1)

📅  最后修改于: 2023-12-03 15:31:39.330000             🧑  作者: Mango

JavaScript | typedArray.@@species 与示例

在 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 的使用方式及其作为继承的强大工具的示例。

希望这篇介绍能帮助您更好地理解并应用这些概念!