2013-03-26 331 views
5

是否有可能在Node.js插件的C++代碼中創建一些enum,然後將此類型公開給js代碼?我發現js中存在本地枚舉類型,但是在v8引擎中沒有關於它們的實現的信息。Node.js native枚舉中的枚舉類型

+1

看來,也不是沒有辦法針對Node.js的插件合法枚舉現在已經改變。在Node.js Google組中,我得到了以下問題的答案: 「你可以做什麼,將它們[參數]導出爲整數並在C++ land中檢查你的 輸入。 – Ivan 2013-04-02 05:28:22

回答

3

在javascript中沒有具體的枚舉類型,而是使用常量int,例如在web中,屬性UNSENT,OPENED, HEADERS_RECEIVED,LOADING,DONEXMLHttpRequest被定義爲C++中的枚舉類型。爲了在V8中導出這些屬性的JavaScript,請使用類似:

Local<Object> obj; 
const char* k = "HEADERS_RECEIVED"; 
int v = 1; 
obj->Set(v8::String::NewSymbol(k), v8::Int32::New(v), ReadOnly); // Use PropertyAttribute ReadOnly so that value won't be changed by javascript. 
4

注意,在通過Kevin給出的例子,你需要使用它,以便確保您撥打Object::New()之前創建的Local<Object>一個實例。

Local<Object> obj = Object::New(); 
const char* k = "HEADERS_RECEIVED"; 
int v = 1; 
obj->Set(v8::String::NewSymbol(k), v8::Int32::New(v), ReadOnly); // Use PropertyAttribute ReadOnly so that value won't be changed by javascript. 
1

這已經根據最新v8 API ref

Isolate* isolate = args.GetIsolate(); 
Local<Context> context = isolate->GetCurrentContext(); 
Local<Object> obj; 
obj->DefineOwnProperty(
         context, 
         String::NewFromUtf8(isolate,"enum"), 
         Number::New(isolate,1), v8::ReadOnly 
         );