在 Node.js Buffer 类上使用 Symbol.species 来创建一个没有多大意义的 FastBuffer

问题描述 投票:0回答:1

我在查看 ws(Node.js 的流行 WebSocket 实现)的

源时发现了 
以下代码

const FastBuffer = Buffer[Symbol.species];

那么,他们如何使用这个

FastBuffer
?好吧,没有自定义实现或任何添加的代码,他们只是用它来从其他缓冲区创建
Buffer
实例:

this._buffers[0] = new FastBuffer(
  buf.buffer,
  buf.byteOffset + n,
  buf.length - n
);
return new FastBuffer(buf.buffer, buf.byteOffset, n);

众所周知,

Buffer
构造函数已被弃用,但除此之外,我什至找不到一个接收
offset
length
的构造函数定义,就像
ws
似乎是的那样使用。

这段代码在幕后做了什么来访问该构造函数?这如何提高性能?这有记录在某处吗?

node.js typescript buffer
1个回答
0
投票

这段代码在幕后做了什么来访问该构造函数?

让我们从

Symbol.species
/
@@species
模式的目的开始:它允许子类定义应使用什么构造函数来创建新实例。您经常会在要复制的实例 (
someObject.constructor[Symbol.species]
) 上使用它,但您可以直接在类上使用它。

看看它返回的内容,它是Node.js 内部使用的

FastBuffer
(那些行号会腐烂),这是一个直接继承自
Uint8Array
(而不是
Buffer
)的类。

事实上

Buffer
支持
@@species
没有记录在案,因此您引用的代码似乎挂钩并依赖于 Node.js 内部结构。

这如何提高性能?

我无法指出具体的内容,但大概 Node.js 实现者将其称为

FastBuffer
是有原因的。 :-) 也许不是一个完整的
Buffer
它可以拥有
Buffer
无法拥有的优化。

这是否记录在某处?

很难证明是否定的,但

@@species
上的
Buffer
不是,在 Node.js API 文档上搜索
FastBuffer
也不会出现任何结果。

众所周知,

Buffer
构造函数已被弃用,但除此之外,我什至找不到接收
offset
length
的构造函数定义,就像
ws
似乎正在使用的那样。

由于我们返回的不一定是

Buffer
,所以这并不重要,但是
Buffer
确实有 构造函数。但更重要的是,(内部?)
FastBuffer
类支持该签名,其父类
Uint8Array
也支持该签名。

© www.soinside.com 2019 - 2024. All rights reserved.