Search code examples
javascriptc++v8

How do I access and call Javascript Object properties and methods from C++ using V8?


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


Solution

  • 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