Создание нового объекта JS с использованием прототипа из объекта в глобальной области видимости - PullRequest
0 голосов
/ 05 декабря 2018

Как создать новый объект, если я расширяю глобальный прототип этого объекта дополнительными функциями?

Вот мой код:

//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, я вижу, что эта функция добавлена.

...