NodeJS Nan Cı eklenti örneğine yuvalanmış nesneyi bağlamak ++

oy
3

Bir C ++ NodeJS projede şu anda üzerinde çalışıyorum, ben gibi, iç içe geçmiş bir nesne içeren bir nesne istiyorum

console.log(object.myObject); // { [keys: string]: any }

Benim eklenti çok iyi çalışıyor özelliklerine nesneleri bağlama olmadan. Ben Örneği ile oluşturmak

auto ctor = Nan::New<v8::FunctionTemplate>(New);
auto ctorInst = ctor->InstanceTemplate();

Ve benzeri sınıf örneğine nesneyi bağlamak

v8::Local<v8::Object> obj = Nan::New<v8::Object>();
ctorInst->Set(Nan::New(myObject).ToLocalChecked(), obj);

ki JS kodu (C ++ uzantısı bir örneğini oluşturmak) yürütülürken, aşağıdaki basar.

içerisinde Önemli hata, çizgi 0

# Kontrol başarısız oldu:! Value_obj-> IsJSReceiver () || value_obj-> IsTemplateInfo ().

Öte yandan bağlama ilkel Açık (sayı, dize, vb) sorunsuz çalışır.

ctorInst->Set(Nan::New(myObject).ToLocalChecked(), Nan::New<v8::Number>(42));

Eğer herhangi bir öneri var mı? Teşekkür ve şerefe!

Oluştur 20/10/2018 saat 13:56
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

(InstanceTemplate en dahil) tüm şablonları yalnızca onları diğer şablonlarına veya temel öğelerini, sahip olabilir. Gördüğünüz gibi, IsTemplateInfobu doğru olmalıydı zaman, yanlış oldu. Benzer bir soru sordum ve cevap verilmiştir burada . Basitçe bir hale ObjectTemplate ve birlikte yaptığımız gibi o zaman doldurmak FunctionTemplate.

Şablon (ile başlatılır Yalnızca GetFunction), gerçek nesneler ile doldurabilirsiniz.

Cevap 23/10/2018 saat 18:08
kaynak kullanıcı

oy
0

Nicholas' cevabı ek olarak aşağıdaki yazıyı eklemek istiyorum.

örnek

Basitçe yerine v8::Objectsahip v8::ObjectTemplate. Nesne şablonu ayarlayın özellikleri ve eklenti örneğine şablonu bağlamak.

v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), objTemplate);

Şimdi kullanabilirler

console.log(addonInstance.myObject); // { prop: 42 }

Prototip

Eğer nesneye işlevleri bağlamak istiyorsanız, yukarıdaki gibi bir nesne şablon oluşturmak. Sonra varolan cpp işlevinden bir işlev şablonu oluşturmak ve nesne şablonun bir obje özelliğine bağlamak. Sonra eklenti örnekleri prototip üzerinde bir şablon oluşturmak.

v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));

auto fn = Nan::New<v8::FunctionTemplate>(setup);
objTemplate->Set(Nan::New("setup").ToLocalChecked(), fn);
Nan::SetPrototypeTemplate(ctor, "myObj", objTemplate);

ve kurulum fonksiyonu basitçe

NAN_METHOD(YourClass::setup) {
  info.GetReturnValue().Set(Nan::New<v8::String>("Hello world").ToLocalChecked());
}

Konsol çıkışı olacaktır

console.log(addonInstance.myObject) // { prop: 42, setup: [Function: setup] }
Cevap 23/10/2018 saat 20:28
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more