2013-03-26 242 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 
         );