v8创建没有方法的对象

时间:2014-05-21 12:39:25

标签: c++ node.js v8

我正在研究v8-profiler的下一个版本,现在我想简化它。

我看到我的班级(ProfileNode)不需要隐藏链接到内部对象(v8::CpuProfileNode),因为我的班级不使用内部对象方法。

  • 我可以删除getter方法并将其替换为下面的示例吗?
  • 这是错误的认识吗?
  • 内存使用率是否高?
  • 或者没关系?

(我是c ++和v8库的新手)

(请忽略版本不兼容 - 这不是问题的一部分)

这是当前profile_node.cc

的一部分
Persistent<ObjectTemplate> ProfileNode::node_template_;

void ProfileNode::Initialize() {
  Local<ObjectTemplate> tpl = NanNewLocal<ObjectTemplate>(ObjectTemplate::New());
  NanAssignPersistent(ObjectTemplate, node_template_, tpl);
  tpl->SetInternalFieldCount(1);
  tpl->SetAccessor(String::New("functionName"), ProfileNode::GetFunctionName);
  ...
}

NAN_GETTER(ProfileNode::GetFunctionName) {
  NanScope();
  Local<Object> self = args.Holder();
  void* ptr = NanGetInternalFieldPointer(self, 0);
  Handle<String> fname = static_cast<CpuProfileNode*>(ptr)->GetFunctionName();
  NanReturnValue(fname);
}

...

Handle<Value> ProfileNode::New(const CpuProfileNode* node) {
  NanScope();

  if (node_template_.IsEmpty()) {
    ProfileNode::Initialize();
  }

  if(!node) {
    return Undefined();
  }
  else {
    Local<Object> obj = NanPersistentToLocal(node_template_)->NewInstance();
    NanSetInternalFieldPointer(obj, 0, const_cast<CpuProfileNode*>(node));
    return obj;
  }
}

重构后

//ProfileNode::Initialize deleted
//ProfileNode::GetFunctionName deleted

Handle<Value> ProfileNode::New(const CpuProfileNode* node) {
  NanScope();

  if(!node) {
    return NanUndefined();
  }
  else {
    //Create new simplest object, instead of new instance of object template
    Local<Object> obj = NanNew<Object>();
    //Append the value to this object
    obj->Set(String::New("functionName"), node->GetFunctionName());
    //Delete internal link.
    //NanSetInternalFieldPointer(obj, 0, const_cast<CpuProfileNode*>(node));
    return obj;
  }
}

0 个答案:

没有答案