Node.JS 的 getHiddenValue 和 setHiddenValue 函数是什么,它们包装了 V8 的 GetPrivate 和 SetPrivate?

What are Node.JS's getHiddenValue and setHiddenValue functions, which wrap V8's GetPrivate and SetPrivate?

出于非常复杂的原因,我正在研究以更好地了解 Node.JS 的内部结构,并发现了两个用途不明的函数。

这些是函数以及如何访问它们。

process.binding('util').setHiddenValue
process.binding('util').getHiddenValue

their native code declarations 开始,很明显它们包装了以下 V8 函数:

v8::Object::SetPrivate
v8::Object::GetPrivate

我还做了一个小片段,展示了他们可以做什么。

'use strict';

var binding = process.binding('util');

var o = {};

binding.setHiddenValue(o, 7, 'testing123');

console.log(binding.getHiddenValue(o, 7)); // returns 'testing123'

但是,我一直找不到关于这些所谓的 "hidden values" 的用途的任何文档,或者无法确定为什么在 Node 或 V8 中需要它们。

谁能阐明他们的真正目的?

作为参考,这些似乎是您可以用来关联数据的唯一有效值(高于 7 会崩溃):

alpn_buffer_private_symbol: 0,
arrow_message_private_symbol: 1,
contextify_context_private_symbol: 2,
contextify_global_private_symbol: 3,
decorated_private_symbol: 4,
npn_buffer_private_symbol: 5,
processed_private_symbol: 6,
selected_npn_buffer_private_symbol: 7,

来自 https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a98ad2e2a82b457a733bee13e4c2ba876 :

Access hidden properties on JavaScript objects. These properties are hidden from the executing JavaScript and only accessible through the V8 C++ API. Hidden properties introduced by V8 internally (for example the identity hash) are prefixed with "v8::".

但是,它们将不会在 v7 及更高版本中使用 -- https://github.com/nodejs/node/commit/924cc6c6335e58f61b04d2f41d348bd6b8be98a1

与普通 JS 比较:

const foo = Object.create({}, {
  privBar: {value: 'private'},
  publBar: {value: 'public', enumerable: true}
})

console.log(foo.privBar) // 'private'
console.log(foo.publBar) // 'public'

请注意,我们仍然可以访问 privBar,因为它并不是真正私有的。但是如果我们 JSON.stringify(foo) 那么只有 publBar 会出现在序列化中。使用 v8 函数,您可以获得更加私密的 privBar.