Av8::Handle<v8::Object>
は、ネイティブ クラスをそのメンバーの一部とともにパックします。これがどのように機能するかです:
someobj = window.createNewWrappedClassObject();
[object Object] { fn1:[function], fn2:[function] .... destroy:[function] };
someobj.fn1(); [...] // do something with someobj
someobj.destroy(); // when done, call destroy(). now someobj not only would be
// inoperable, it would also get set to {} or null or etc.
、someobj.fn1()
、someobj.fn2()
がsomeobj.destroy()
ラップされた関数です。コンストラクターの初期化ロジックは次のようになります。
WrappedClass::GetWrappedObject(){
Local<ObjectTemplate> objectTemplate = ObjectTemplate::New();
objectTemplate->SetInternalFieldCount(1);
this->instance = objectTemplate->NewInstance();
this->instance->SetPointerInInternalField(0, this);
this->instance->Set(String::New("fn1"),
FunctionTemplate::New(Fn1)->GetFunction());
[...] // so on
}
destroy()
今問題は、私が基本的にやりたかったことを呼び出すとき、そのオブジェクトへのすべての参照を強制的に にすることでしたnull
。だからここに私が考えたことがあります:
Handle<Value> WrappedClass::Fn1(const Arguments& args){
WrappedClass * CurrentInstance =
static_cast<WrappedClass *>(args.This()->GetPointerFromInternalField(0));
CurrentInstance->~WrappedClass();
CurrentInstance->instance->Clear(); // tricky part right here and
args.This()->Clear(); // also here on these two lines
return v8::Null();
}
何が起こるのですか?何も起こらず、関数が実際に戻ることはありません。私はこれを呼び出さず ->Clear()
、代わりsomeobj = someobj.destroy();
にJSで修正しました。
しかし、ここが面白いところです。何度も実行した後、コンピューター全体が狂ってしまいました。エクスプローラー ウィンドウのフォントが失われ、ウィンドウの装飾が失われ、タスクバーのシステム時間が消え、スタート メニューにアイコンではなく暗い四角形が表示されます。あなたはそれに名前を付けます。
なぜこれが起こったのですか?そして、代わりに呼び出し元のオブジェクトを null に設定するにはどうすればよいでしょうか?