Как создать новый объект, если я расширяю глобальный прототип этого объекта дополнительными функциями?
Вот мой код:
//global initialization
Local<ObjectTemplate> global = ObjectTemplate::New(_isolate);
Eternal<FunctionTemplate> ProtocolGame_global(_isolate, ProtocolGame::createTemplate(_isolate));
global->Set(String::NewFromUtf8(_isolate, "ProtocolGame", NewStringType::kNormal).ToLocalChecked(), ProtocolGame_global.Get(_isolate));
Local<Context> context = Context::New(_isolate, NULL, global);
ProtocolGame :: createTemplate function:
Local<FunctionTemplate> ProtocolGame_class = FunctionTemplate::New(isolate);
Local<ObjectTemplate> ProtocolGame_proto = ProtocolGame_class->PrototypeTemplate();
Local<ObjectTemplate> ProtocolGame_inst = ProtocolGame_class->InstanceTemplate();
ProtocolGame_class->SetClassName((String::NewFromUtf8(isolate, "ProtocolGame", NewStringType::kInternalized).ToLocalChecked()));
ProtocolGame_inst->SetInternalFieldCount(1);
ProtocolGame_proto->Set(Symbol::GetToStringTag(isolate), String::NewFromUtf8(isolate, "ProtocolGame", NewStringType::kNormal).ToLocalChecked(), static_cast<PropertyAttribute>(ReadOnly | DontEnum));
ProtocolGame_proto->Set(String::NewFromUtf8(isolate, "getOutputBuffer", NewStringType::kInternalized).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__getOutputBuffer));
ProtocolGame_proto->Set(String::NewFromUtf8(isolate, "disconnect", NewStringType::kInternalized).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__disconnect));
ProtocolGame_proto->Set(String::NewFromUtf8(isolate, "disconnectClient", NewStringType::kInternalized).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__disconnectClient));
ProtocolGame_proto->Set(String::NewFromUtf8(isolate, "send", NewStringType::kInternalized).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__send));
ProtocolGame_proto->Set(String::NewFromUtf8(isolate, "writeToOutputBuffer", NewStringType::kInternalized).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__writeToOutputBuffer));
ProtocolGame_class->Set(String::NewFromUtf8(isolate, "bindOnSpawnInWorld", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__bindOnSpawnInWorld));
ProtocolGame_class->Set(String::NewFromUtf8(isolate, "bindOnPacket", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, &ProtocolGame::__bindOnPacket));
return ProtocolGame_class;
Это моя функция обтекания, которую я использую, чтобы обернуть свой объект в JS:
if (protocol_game_template.IsEmpty()) {
Local<ObjectTemplate> raw_template = createTemplate(GetIsolate());
protocol_game_template.Reset(GetIsolate(), raw_template);
}
Local<ObjectTemplate> templ = Local<ObjectTemplate>::New(GetIsolate(), protocol_game_template);
Local<Object> result = templ->NewInstance(GetIsolate()->GetCurrentContext()).ToLocalChecked();
Local<External> protocol_ptr = External::New(GetIsolate(), this);
result->SetInternalField(0, protocol_ptr);
И в JS я добавляю функции к прототипу, например:
ProtocolGame.prototype.parseLogout = function() {
this.disconnect();
}
Но послеЯ обертываю свой объект ProtocolGame (используя функцию обтекания) и передаю его в качестве аргумента функции; функция (parseLogout) из JS не видна при переборе объекта-прототипа.Я попытался получить прототип из глобальной области видимости, но он не сработал, как ожидалось.
У меня он работает так же, как с другим объектом, разница в том, что я создаю этот объект в JS, используя оператор new,поэтому он запускает новую функцию C ++ и там я могу легко получить прототип, потому что у меня есть ссылка на объект, который использовался для создания нового экземпляра:
v8::Local<v8::Object> holder = args.Holder();
v8::Local<v8::Object> This = args.This();
v8::Local<v8::Value> proto = holder->GetPrototype();
if (proto->IsObject()) {
This->SetPrototype(args.GetIsolate()->GetCurrentContext(), proto);
}
, но я не могу найти способ получить прототип изэтот глобальный экземпляр.
Примечание. Когда я перебираю ключи ProtocolGame.prototype, я вижу, что эта функция добавлена.