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

出于非常复杂的原因,我正在研究更好地理解Node.JS的内部,并且发现了两个不明原因的function。

这些function以及如何访问它们。

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

从他们的本地代码声明中 ,很明显他们包装了以下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' 

但是,我一直无法find这些所谓的“隐藏值”的文档,或者以其他方式确定为什么在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

访问JavaScript对象的隐藏属性。 这些属性对正在执行的JavaScript是隐藏的,只能通过V8 C ++ API访问。 V8内部引入的隐藏属性(例如身份散列)以“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的function,你会得到一个更私人的privBar