I'd like an example of how to access and call Javascript object properties and methods from C++ using the v8 engine. The documentation shows how to access C++ objects and functions through javascript but not the other way around.
Here's a simple object constructor and instance in JS:
function MyObj()
{
this.myArray = [];
this.myDouble = 0;
this.myFunction = function(arg1,arg2)
{ return (myDouble + arg1 + arg2); }
}
var globalObject = new myObj();
How would I access globalObject's properties and methods? Also a somewhat related question -- how can I populate the array (globalObject.myArray) from C++?
Regards,
Pris
I haven't tested the examples below.
But I believe it gives an example of what you want.
#include <v8.h>
using namespace v8;
int main(int argc, char* argv[]) {
// Create a handle scope
HandleScope handle_scope;
// Create a new context.
Handle<Context> context = Context::New();
// Enter the created context for compiling and
// running the script.
Context::Scope context_scope(context);
// Create a new script
const char* script = "function MyObj() { this.myArray = []; this.myDouble = 0; this.myFunction = function(arg1,arg2) { return (myDouble + arg1 + arg2); } } var globalObject = new myObj();"
// Create a string containing the JavaScript source code.
Handle<String> source = String::New("script");
// Compile the source code.
Handle<Script> script = Script::Compile(source);
// Running the script
// Run the script to get the result.
Handle<Value> scriptresult = script->Run();
// Convert the result to an ASCII string and print it.
String::AsciiValue ascii(scriptresult);
printf("%s\n", *ascii);
// Get the object
Handle<Object> object = Local::Cast(context->Global()->Get(String::New("globalObject")));
// Get the Properties
Handle<Value> arrayproperty = Handle::Cast(object->Get(String::New("myArray")));
Handle<Value> doubleproperty = Handle::Cast(object->Get(String::New("myDouble")));
String::AsciiValue ascii2(arrayproperty);
String::AsciiValue ascii3(doubleproperty);
printf("%s\n", *ascii2);
printf("%s\n", *ascii3);
// Call the function
Handle fun_to_call = Handle::Cast(object->Get(String::New("myFunction")));
int argcount = 0;
Handle argarray[] = NULL;
Handle functionresult = fun_to_call->Call(object, argcount, argarray);
// argcount and argarray are your standard arguments to a function
return 0;
}
As for how to modify the array I believe it would be using
// Get the object
Handle<Object> object = Local::Cast(context->Global()->Get(String::New("globalObject")))1;
//Initialise array
int num[4] = {1,2,3,4};
v8::Local<v8::Array> arguments = v8::Array::New(num);
for (int i = 0; i < args; i++) {
arguments.Set(v8::Number::New(i), v8::String::New(args[i]));
}
// Set Array
object->Set(v8::String::New("myArray"), arguments);
References
CodeProject Using V8
Connecting C++ to Javascript bungeeconnect
Google V8 Shell Sample Code
Google V8 Header File
V8 Users Mailing List Can you populate a v8::Array from C++? Thread
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With