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

标签 javascript

我刚刚翻译了一篇关于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/

相关文章:

javascript - vue.js 中的计数器不增加

javascript - 动画等待完全完成才能重新开始

javascript - 使用文件输入的 onchange 的解决方法是什么?

javascript - 如何使用 Javascript 或 jQuery 对单选按钮值求和?

javascript - 如何管理仅客户端的大型 Web 应用程序

javascript - 在 Bootstrap 容器的开头启动光滑的 slider 并全宽滚动

javascript - 在结果页面上隐藏 CSS 类

javascript - 哪个应该生成 HTML : JavaScript or php?

javascript - Jquery 验证插件 - 仅在某些情况下适用于数字字段

javascript - 滑动垂直菜单 : prevent the title from moving left on hover