Ich habe 2 C ++ - Klassen als JavaScript-Klassen, VanillaOption
und NoomraEngine
, die beide von ObjectWrap
erben.
In der folgenden Methode in NoomraEngine
sollte ich eine zuvor "eingepackte" VanillaOption
:
Alles funktioniert gut, außer dass wenn ich den falschen Typ an die Methode übergebe, der Knoten in ObjectWrap::Unwrap
abstürzt.
Wie kann ich sicherstellen, dass ich den korrekten Typ in args[0]
?
BEARBEITEN: Eine bessere Methode als die blanke V8-Version ist NanHasInstance
( Ссылка )
In MyObject::Init
:
wobei prototype
ein statisches Persistent<FunctionTemplate>
Mitglied von MyObject
ist.
Verwenden Sie so:
%Vor% Mit dem Vorbehalt, dass dies mein erster Schritt beim Schreiben eines Knoten-Addons ist, habe ich dieses genaue Problem gelöst, indem ich den Prototyp des Objekts mit meinem eigenen Wrapper um UnWrap
überprüft habe.
Hier ist ein Patch zur Addon-Factory-Class-Demo, der die Methode zeigt: Ссылка
Es werden nur fabrikgenerierte Objekte unterstützt und nicht solche, bei denen ein Konstruktor verfügbar ist, so dass Benutzer von der Basisklasse erben können. Dies könnte jedoch verallgemeinert werden, indem man die Prototypkette führt.
Zusammenfassend wird der Verweis auf den erwarteten Klassenprototyp in MyObject::Init
festgehalten:
Und überprüft das vor dem Dereferenzieren des Objekts:
%Vor% Alle Funktionen verwenden stattdessen CheckedUnWrap
:
Ich habe auch darüber nachgedacht, ein internes Feld hinzuzufügen und das auf einige magische Zeiger zu setzen, aber dann wäre der Code davon abhängig gewesen, dass node::ObjectWrap
nicht ändern würde, wie er die internen Felder verwendet.
Aktualisieren : Da NanHasInstance
veraltet ist, lautet die neue Lösung für diese Antwort bool FunctionTemplate::HasInstance(Local<Value> object)
. Diese Funktion gibt true zurück, wenn das angegebene Objekt eine Instanz dieser Funktionsvorlage ist.
Setzen Sie dann in Ihrer Funktion Wrapper::Init()
das öffentliche persistente Objekt:
Jetzt zum Auspacken:
%Vor%