2012-02-05 19 views
8

Tôi muốn một ví dụ về cách truy cập và gọi các thuộc tính và phương thức đối tượng Javascript từ C++ bằng cách sử dụng công cụ v8. Tài liệu hướng dẫn cho thấy cách truy cập các đối tượng và hàm C++ thông qua javascript nhưng không phải là cách khác.Làm cách nào để truy cập và gọi các thuộc tính và phương thức đối tượng Javascript từ C++ bằng V8?

Dưới đây là một constructor đơn giản đối tượng và dụ trong JS:

function MyObj() 
{ 
    this.myArray = []; 
    this.myDouble = 0; 
    this.myFunction = function(arg1,arg2) 
     { return (myDouble + arg1 + arg2); } 
} 

var globalObject = new myObj(); 

Làm thế nào tôi có thể truy cập vào các thuộc tính và phương pháp globalObject không? Ngoài ra một câu hỏi có liên quan phần nào - làm thế nào tôi có thể cư trú mảng (globalObject.myArray) từ C + +?

Kính trọng,

pris

Trả lời

6

tôi đã không kiểm tra các ví dụ dưới đây.

Nhưng tôi tin rằng nó đưa ra một ví dụ về những gì bạn muốn.

#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; 


} 

Đối với làm thế nào để sửa đổi các mảng tôi tin rằng nó sẽ được sử dụng

// 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); 

Tài liệu tham khảo

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

0

Là một theo dõi câu trả lời thấu đáo Appleman của, cho những gì nó có giá trị, tôi đã phải sử dụng -> thay vì ., và bạn không cần phải phân bổ một mới v8::Number đối số đầu tiên cho 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)); 
} 
0

Xin lỗi vì đã làm mới nhưng tôi đang tìm kiếm chính xác điều tương tự và tôi không có thể ai đó sẽ cần nó.

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

Bạn chỉ cần thêm một bộ lọc :))

Các vấn đề liên quan