Сделать свойства и методы объекта v8 видимыми для JS

Я обертываю объект C ++ node::ObjectWrap и у меня есть некоторые методы, определенные как:

auto tpl = NanNew<v8::FunctionTemplate>(New);
tpl->SetClassName(NanNew("className"));
tpl->InstanceTemplate()->SetInternalFieldCount(4);

NanSetPrototypeTemplate(tpl, NanNew("method1")  , NanNew<v8::FunctionTemplate>(Method1) , v8::ReadOnly);
NanSetPrototypeTemplate(tpl, NanNew("method2")  , NanNew<v8::FunctionTemplate>(Method2), v8::ReadOnly);
NanSetPrototypeTemplate(tpl, NanNew("method3")  , NanNew<v8::FunctionTemplate>(Method3) , v8::ReadOnly);
NanSetPrototypeTemplate(tpl, NanNew("method4")  , NanNew<v8::FunctionTemplate>(Method4), v8::ReadOnly);

Все работает так, как ожидалось, и я могу создать экземпляр объекта в JS:

var classInstance = new className();

Все методы работают нормально, но когда я пытаюсь войти в функцию:

console.log(classInstance);

Я ожидаю увидеть что-то вроде:

{
method1 : [Native Function],
method2 : [Native Function],
method3 : [Native Function],
method4 : [Native Function]
}

Но то, что я получаю, это:

{}

Любые мысли о том, как сделать это видимым (ака перечислимым)?

2

Решение

То, что у вас есть, по сути

var tpl = function(){};
tpl.prototype.method1 = function(){};
tpl.prototype.method2 = function(){};
tpl.prototype.method3 = function(){};
tpl.prototype.method4 = function(){};

var inst = new tpl();

console.log(tpl);

Дело в том, что то, что распечатано, не включает значения в цепочке прототипов. Так inst фактически не имеет никаких свойств для печати, следовательно {}, Только inst.__proto__ имеет свойства. Свойства перечислимы, так что вы можете сделать Object.keys(inst.__proto__); чтобы увидеть их, но они не own свойства inst,

2

Другие решения


По вопросам рекламы [email protected]