From 620d011b8ce2b20dda1a173364b4cb4afacb3791 Mon Sep 17 00:00:00 2001 From: Jason Lam Date: Mon, 20 Nov 2023 18:38:56 +0800 Subject: [PATCH] [zh-cn]: update the translation of ArrayBuffer.@@species (#17014) --- .../arraybuffer/@@species/index.md | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/files/zh-cn/web/javascript/reference/global_objects/arraybuffer/@@species/index.md b/files/zh-cn/web/javascript/reference/global_objects/arraybuffer/@@species/index.md index e1d6b3500e89e8..c3f96c3cb81b4d 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/arraybuffer/@@species/index.md +++ b/files/zh-cn/web/javascript/reference/global_objects/arraybuffer/@@species/index.md @@ -1,35 +1,63 @@ --- -title: get ArrayBuffer[@@species] +title: ArrayBuffer[@@species] slug: Web/JavaScript/Reference/Global_Objects/ArrayBuffer/@@species --- {{JSRef}} -该 **`ArrayBuffer[@@species]`** 访问器属性会返回 `ArrayBuffer` 构造器。 +**`ArrayBuffer[@@species]`** 静态访问器属性返回用于构造数组缓冲区方法返回值的构造函数。 + +> **警告:** `@@species` 的存在允许任意代码执行,并可能产生安全漏洞。这也使某些优化变得更加困难。引擎实现者正在[调查是否删除此特性](https://github.com/tc39/proposal-rm-builtin-subclassing)。如果可能的话,请避免依赖它。 ## 语法 -```plain +```js-nolint ArrayBuffer[Symbol.species] ``` +### 返回值 + +调用 `get @@species` 的构造函数(`this`)的值。该返回值被用于构造创建新的数组缓冲区的数组缓冲区方法的返回值。 + ## 描述 -这个 species 访问器属性会返回默认的 `ArrayBuffer` 构造器。子类构造器可能会覆盖它以改变构造器赋值。 +`@@species` 访问器属性返回 `ArrayBuffer` 对象的默认构造函数。子类构造函数可以重写它来更改构造函数赋值。基本的默认实现是: + +```js +// 用于说明的假设基础实现 +class ArrayBuffer { + static get [Symbol.species]() { + return this; + } +} +``` + +由于这种多态实现,派生子类的 `@species` 也将默认返回构造函数本身。 + +```js +class SubArrayBuffer extends ArrayBuffer {} +SubArrayBuffer[Symbol.species] === SubArrayBuffer; // true +``` + +当调用不会修改现有对象,而是返回一个新的数组缓冲区实例数组缓冲区方法(例如,[`slice()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice))时,对象的 `constructor[@@species]` 将被访问。返回的构造函数将用于构造该数组缓冲区方法的返回值。 ## 示例 -返回默认的 `ArrayBuffer` 构造器: +### 普通对象中的 species + +`@@species` 属性返回默认构造函数,即 `ArrayBuffer` 构造函数。 ```js ArrayBuffer[Symbol.species]; // function ArrayBuffer() ``` -在派生集合对象中(比如你定制的 array buffer `MyArrayBuffer`),`MyArrayBuffer` species 就是 `MyArrayBuffer` 构造器。但是,你可能想要在派生类里重写它,以期返回的是父类的 `ArrayBuffer` 对象: +### 派生对象中的 species + +在一个自定义的 `ArrayBuffer` 子类实例中,例如 `MyArrayBuffer`,`MyArrayBuffer` 的 `species` 是 `MyArrayBuffer` 构造函数。但是,你可能希望重写它,以便在派生类方法中返回父类 `ArrayBuffer` 对象: ```js class MyArrayBuffer extends ArrayBuffer { - // Overwrite MyArrayBuffer species to the parent ArrayBuffer constructor + // 重写 MyArrayBuffer species 来返回父类 ArrayBuffer 构造函数 static get [Symbol.species]() { return ArrayBuffer; } @@ -44,7 +72,7 @@ class MyArrayBuffer extends ArrayBuffer { {{Compat}} -## 相关 +## 参见 - {{jsxref("ArrayBuffer")}} - {{jsxref("Symbol.species")}}