我在查看 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
似乎是的那样使用。
这段代码在幕后做了什么来访问该构造函数?这如何提高性能?这有记录在某处吗?
这段代码在幕后做了什么来访问该构造函数?
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
也支持该签名。