V8:如何在Persistent句柄上使用Set方法?
关于Persistent句柄属性设置的问题解答
Persistent句柄是不是只读的?
不是。Persistent类没有提供Set方法只是V8 API的设计差异,和读写权限无关。
Persistent句柄的核心定位是管理堆对象的长生命周期引用,和用来做短生命周期操作的Local句柄分工不同,所以属性修改这类操作没有直接封装在Persistent类的接口中,不代表它指向的对象不可修改。
设置Persistent句柄指向对象属性的最优方案
标准操作是先将Persistent句柄转为Local句柄后再修改属性,两者指向堆中的同一个对象,修改会直接生效:
- 首先在当前Isolate的有效
HandleScope作用域内,调用Local<T>::New(isolate, persistent_handle)将Persistent句柄转换为对应类型的Local句柄 - 直接通过转换得到的Local句柄调用
Set方法设置属性即可
代码示例
// 现有已初始化的Persistent<Object>实例 persistent_obj v8::Isolate* isolate = v8::Isolate::GetCurrent(); // 必须创建HandleScope管理短生命周期Local句柄 v8::HandleScope scope(isolate); // Persistent转Local v8::Local<v8::Object> local_obj = v8::Local<v8::Object>::New(isolate, persistent_obj); // 设置属性,操作逻辑和普通Local句柄完全一致 local_obj->Set( isolate->GetCurrentContext(), v8::String::NewFromUtf8(isolate, "custom_attr", v8::NewStringType::kNormal).ToLocalChecked(), v8::Number::New(isolate, 456) ).Check();
额外说明
如果你需要修改的是Persistent句柄本身的指向(即让它指向另一个新对象),直接调用Persistent句柄的Reset方法即可:persistent_handle.Reset(isolate, new_local_obj)
内容的提问来源于stack exchange,提问作者Rodion Degtyar
相关产品推荐
相关产品推荐

