2016-12-19 11 views
6

非常に複雑な理由から、私はNode.JSの内部をよりよく理解するために研究しており、未知の目的の2つの機能を発見しました。V8のGetPrivateとSetPrivateをラップするNode.JSのgetHiddenValue関数とsetHiddenValue関数は何ですか?

これらは機能とアクセス方法です。 their native code declarationsから

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' 

しかし、私はこれらのいわゆる「隠れた値は」のためのもの、またはそれらはノードまたは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, 
+0

文書化されていないので、それらを使用することは非常に悪い考えです。 :-) 1つのドットリリースから次のドットリリースに変わる可能性があります。 –

+0

@ T.J.Crowder私はこれを理解しています。私の目的は非常に珍しいです。 :) –

答えて

3

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

アクセス隠された性質JavaScriptオブジェクト上。これらのプロパティは実行中のJavaScriptから隠されており、V8 C++ APIを介してのみアクセスできます。内部的にV8によって導入された隠しプロパティ(例えば、IDハッシュ)には接頭辞「v8 ::」が付いています。それは本当にないので、我々はまだprivBarにアクセスすることができます

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

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

お知らせ:バニラJSと比較するhttps://github.com/nodejs/node/commit/924cc6c6335e58f61b04d2f41d348bd6b8be98a1

-

しかし、彼らはV7にし、超えて使用されることはありませんプライベート。しかし、JSON.stringify(foo)の場合は、publBarしかシリアル化されません。 v8の機能を使うとさらにプライベートになりますprivBar

+0

ニースが見つかりました!どのような正確に彼らが実際に使用されているかの兆候(私は質問に使用されている定数名を追加しました)?また、私はノードバージョンv7.2.1を使用しているので、v7を削除することについてはわかりません。 –

+0

私の答えは、あなたが 'Set/GetHiddenValue'について質問したときでした。そのv7コミットは 'Set/GetPrivate'に切り替わります。いずれにせよ、彼らは同じものでなければならない。より新しいペアは、優先的に更新されたコードです。彼らが何のために使われているかについては、私はNodeが本当にプライベートにしておきたいことを想定しています。 –

+0

ああ、意味がある。私は彼らがV8コードで設定されているように、V8の内部であると推測していましたが、Node-landですべて定義されているように見えます。私は、純粋なJSの中で最も近いものは「WeakMap」だろうと思います。 –

関連する問題