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,
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
.
出于非常复杂的原因,我正在研究以更好地了解 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,
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
.