8

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

3 Answers 3

6

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

Sign up to request clarification or add additional context in comments.

Comments

0

As a follow-up to Appleman's thorough answer, for what it's worth, I had to use -> instead of ., and you don't have to allocate a new v8::Number for the first argument to Set:

v8::Local<v8::Array> r = v8::Array::New(10);
for (uint32_t i = 0; i < 10; ++i) {
    r->Set(i, v8::Number::New(i));
}

Comments

0

Sorry for refresh but I was searching exactly same thing and I dont't so maybe someone will need it.

targetObj->GetOwnPropertyNames(context,v8::PropertyFilter::ALL_PROPERTIES)

You just need to add a filter :))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.