gpt4 book ai didi

javascript - MDN 中的 Symbol.species 示例没有意义?

转载 作者:行者123 更新时间:2023-11-28 04:39:25 25 4
gpt4 key购买 nike

我刚刚翻译了一篇关于Symbol.species的文章在 MDN 中,当我偶然发现以下部分时:

You might want to return Array objects in your derived array class MyArray. For example, when using methods such as map() that return the default constructor, you want these methods to return a parent Array object, instead of the MyArray object. The species symbol lets you do this:

class MyArray extends Array {
// Overwrite species to the parent Array constructor
static get [Symbol.species]() { return Array; }
}
var a = new MyArray(1,2,3);
var mapped = a.map(x => x * x);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true

除了翻译文本时遇到困难(这让我感觉不知道发生了什么)之外,代码也无法证明他们的观点。当我注释掉该行 static get [Symbol.species]() { return Array; } 结果是完全相同的。

这是我的代码:

"use strict";

class MyArray extends Array {
// Overwrite species to the parent Array constructor
// static get [Symbol.species]() { return Array; }
}
var a = new MyArray(1,2,3);
var mapped = a.map(x => x * x);

console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true

我的控制台输出:

➜ node test.js
false
true

那篇文章是完全错误的,还是我作为一个 JS/Node 初学者遗漏了一个重要的细节?

最佳答案

您遗漏了一个重要的细节。如果您对数组进行子类化,然后使用 Symbol.species 执行map,您可以返回一个数组,而不是派生类的成员。有时您需要这样做,例如,如果您作为库作者公开 API。您可能需要一些特殊的子类酱供内部使用,但公开返回常规数组的方法以供公共(public)使用。

并且没有真正的限制,您可以为任何东西设置备用构造函数。

至于为什么注释掉该行不会改变任何内容,请记住,子类化内置函数是新的,可能没有完全正确地实现,对于 Node.js 来说尤其如此,如果它们 catch 潮流的话早期,他们在 LTS 中多年支持一些“错误”的东西(他们在 Object.observe 上为此而被烧伤)。

关于javascript - MDN 中的 Symbol.species 示例没有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43909279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com