При использовании V8 в качестве механизма создания сценариев я выставляю Javascript функцию C++ под названием construct_with_ec6_syntax
. Эта функция при вызове должна просто вернуть экземпляр some_ec6_class
.Как вернуть новый экземпляр класса «V8» класса V8 из C++?
Это C++ в основном должна сделать следующее эквивалент Javascript:
return new some_ec6_class(111, 222);
Этот класс будет определен в Javascript следующим с EC6 синтаксис:
class some_ec6_class
{
constructor(x, y) {
this.result = x + y;
}
}
Моя цель заключается в запуске следующие в Javascript ...
var the_instance = construct_with_ec6_syntax(111, 222);
the_instance.result ; // .. and get 333 here.
Моя текущая реализация для функции C++ заключается в следующем:
void construct_with_ec6_syntax(const FunctionCallbackInfo<Value>& args) {
Handle<Object> global = args.GetIsolate()->GetCurrentContext()->Global();
std::string newvecfunc = "some_ec6_class";
Handle<Value> value = global->Get(String::NewFromUtf8(args.GetIsolate(), newvecfunc.c_str(), String::kNormalString, newvecfunc.length()));
Local<Value> result;
if (value->IsFunction()) {
Handle<Function> func = Handle<Function>::Cast(value);
Handle<Value> args2[2];
args2[0] = Number::New(args.GetIsolate(), 111);
args2[1] = Number::New(args.GetIsolate(), 222);
result = func->CallAsConstructor(args.GetIsolate()->GetCurrentContext(), 2, args2).ToLocalChecked();
}
args.GetReturnValue().Set(result);
}
Выполнение этой функции из JavaScript, имеет его вернуть undefined
! Вместо объекта, которого я ожидаю. Как указал мне xaxxon, это потому, что value->IsFunction()
возвращает false, но value->IsUndefined()
возвращает true. Если бы я определил класс, используя с не синтаксиса EC6, выше функция делает возвращает экземпляр ..
function some_non_ec6_class(x, y) // this guy would work with the above function
{
this.result = x + y;
}
Так что я немного запутался! Должен ли я как-то быть более конкретным, например, сначала получить функцию constructor
от объекта, а затем вызвать CallAsConstructor
?
Любые подсказки оцениваются!
(Этот вопрос похож на Calling a v8 javascript function from c++ with an argument но отличается.)
Я использую V8 проверку от 22 октября 2016 года Полный тестовый:
https://gist.github.com/rayburgemeestre/c0abd528f6f67edbfe686d484c45ddbb
Незначительное обновление :
Как вы можете видеть в комментариях, я также рассмотрел более конкретный случай ING «выборки» класс из контекста здесь: https://gist.github.com/rayburgemeestre/df6193d532c7b7908fe27c89799bfa3a
Также я отправил в список рассылки v8-пользователей: https://groups.google.com/forum/#!topic/v8-users/Hj2j4rJMwBw
Пожалуйста, обновите свой вопрос, чтобы кратко изложить свой текущий вопрос , так как ответов на него пока нет. Нам не нужно знать ваш процесс, чтобы добраться до того, где вы сейчас находитесь. Или, если вам больше не нужна помощь, просто удалите вопрос вообще. – xaxxon
@xaxxon Да, мне все еще нужна помощь, я удалил часть процесса –
. Кажется, вы не слишком много проверяете ошибки. Возвращает ли значение if (value-> IsFunction()) значение true? Если это никогда не будет выполняться, это объяснит ваше возвращаемое значение. – xaxxon