使JS可以看到v8对象属性和方法

时间:2014-07-18 16:07:35

标签: c++ node.js v8 node.js-addon node.js-nan

我用node::ObjectWrap包装一个C ++对象,我有一些方法定义如下:

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]
}

但我得到的是:

{}

关于如何使这些可见(也称为可枚举)的任何想法?

1 个答案:

答案 0 :(得分: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的{​​{1}}属性。