2016-12-19 5 views
6

Z bardzo skomplikowanych powodów poszukuję lepszego zrozumienia elementów Node.JS i odkryłem dwie funkcje o nieznanym przeznaczeniu.Co to są funkcje getHiddenValue i setHiddenValue Node.JS, które zawijają GetPrivate i SetPrivate V8?

To są funkcje i sposoby dostępu do nich.

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

Od their native code declarations, to jasne, że owinąć następujące funkcje V8:

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

Ja również trochę fragment tego rodzaju-z pokazuje, co mogą zrobić.

'use strict'; 

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

var o = {}; 

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

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

Jednak byłem w stanie znaleźć żadnej dokumentacji na co te tak zwane „ukryte wartości” są przeznaczone, lub w inny sposób określić, dlaczego są one potrzebne w węźle lub w V8.

Czy ktoś może rzucić nieco światła na ich prawdziwy cel? , te pojawia

Dla odniesienia się jedynymi poprawnymi wartościami można użyć, aby powiązać dane przez (wyższa niż 7 padnie):

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

Ponieważ nie są udokumentowane, używanie ich jest z pewnością bardzo złym pomysłem? :-) Mogliby zmienić z jednej kropki na następną. –

+0

@ T.J.Crowder Rozumiem to. Moje cele są bardzo niezwykłe. :) –

Odpowiedz

3

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

dostęp do ukrytych właściwości na obiektach JavaScript. Te właściwości są ukryte przed wykonywanym JavaScriptem i są dostępne tylko za pośrednictwem interfejsu API V8 C++. Ukryte właściwości wprowadzone wewnętrznie przez V8 (na przykład hash tożsamości) poprzedzone są prefiksem "v8 ::".

Jednak nie będą one wykorzystywane w v7 i poza nią - https://github.com/nodejs/node/commit/924cc6c6335e58f61b04d2f41d348bd6b8be98a1

Aby porównać z wanilii JS:

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

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

Zauważ, że wciąż możemy uzyskać dostęp privBar bo to naprawdę nie jest prywatny. Ale jeśli mamy JSON.stringify(foo), tylko publBar pojawi się w serializacji. Dzięki funkcjom v8 zyskujesz jeszcze bardziej prywatny privBar.

+0

Nice find! Jakiekolwiek wskazanie, do czego dokładnie są one faktycznie używane (dodałem stałe nazwy, które są używane do pytania)? Używam również wersji węzła v7.2.1, więc nie jestem pewien, czy je usunięto w wersji 7? –

+0

Moja odpowiedź brzmiała, gdy pytałeś o 'Set/GetHiddenValue'. To zatwierdzenie v7 przełącza na 'Set/GetPrivate'. Tak czy inaczej, powinny być tym samym; nowsza para jest po prostu preferowanym zaktualizowanym kodem. Jeśli chodzi o to, do czego są używane, zakładam, że rzeczy, które Node naprawdę chce zachować w tajemnicy. –

+0

Ach, ma sens. Zgadłbym, że są one wewnętrzne dla V8, ponieważ wydają się być ustawione przez kod V8, ale wygląda na to, że wszystkie są zdefiniowane w Node-land. Myślę, że najbliższą rzeczą w czystym JS byłaby "WeakMap". –