使用JSVM-API接口进行private相关开发
=========================

#### 简介

JSVM-API 提供操作私有属性的接口。

#### 基本概念

JSVM-API提供创建private key的能力，并支持在对象上使用该key进行属性的创建与删除，同时持久化保存private key symbol。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_CreateDataReference | 在JSVM中创建一个带有指定引用计数的数据引用。 |
| OH\_JSVM\_GetReferenceData | 检查指定的引用是否有效, 返回该引用关联的JavaScript数据, 无效result设置为NULL。 |
| OH\_JSVM\_CreatePrivate | 创建一个js private key对象。 |
| OH\_JSVM\_SetPrivate | 为传入的object设置一个private属性。 |
| OH\_JSVM\_GetPrivate | 获取传入的object中private key对应的private属性。 |
| OH\_JSVM\_DeletePrivate | 删除传入的object中private key对应的private属性。 |

#### 使用示例

JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-jsvm-process)，本文仅对接口对应C++相关代码进行展示。

#### \[h2\]使用接口创建 private key 并添加对应 private property，随后删除

cpp部分代码

static JSVM\_Value privateTest(JSVM\_Env env, JSVM\_CallbackInfo info) {
    JSVM\_VM vm;
    JSVM\_HandleScope outerScope;
    OH\_JSVM\_GetVM(env, &vm);
    OH\_JSVM\_OpenHandleScope(env, &outerScope);

    JSVM\_HandleScope handleScope;
    JSVM\_Data privateKey;
    JSVM\_Value object;
    JSVM\_Value property;
    JSVM\_Ref privateRef;
    {
        OH\_JSVM\_OpenHandleScope(env, &handleScope);
        OH\_JSVM\_CreateObject(env, &object);
        OH\_JSVM\_CreatePrivate(env, nullptr, &privateKey);
        OH\_JSVM\_CreateInt32(env, 1, &property);
        OH\_JSVM\_SetPrivate(env, object, privateKey, property);
        OH\_JSVM\_GetPrivate(env, object, privateKey, &property);
        int propertyValue = 0;
        OH\_JSVM\_GetValueInt32(env, property, &propertyValue);
        OH\_LOG\_INFO(LOG\_APP, "private property set: %{public}d\\n", propertyValue);
        OH\_JSVM\_DeletePrivate(env, object, privateKey);
        OH\_JSVM\_GetPrivate(env, object, privateKey, &property);
        bool isUndefined = false;
        OH\_JSVM\_IsUndefined(env, property, &isUndefined);
        OH\_LOG\_INFO(LOG\_APP, "private property deleted is undefined: %{public}d\\n", isUndefined);
        OH\_JSVM\_CreateDataReference(env, privateKey, 1, &privateRef);
        OH\_JSVM\_CloseHandleScope(env, handleScope);
    }
    {
        OH\_JSVM\_OpenHandleScope(env, &handleScope);
        OH\_JSVM\_GetReferenceData(env, privateRef, &privateKey);
        OH\_JSVM\_CreateObject(env, &object);
        OH\_JSVM\_CreateInt32(env, 2, &property);
        OH\_JSVM\_SetPrivate(env, object, privateKey, property);
        OH\_JSVM\_GetPrivate(env, object, privateKey, &property);
        int propertyValue = 0;
        OH\_JSVM\_GetValueInt32(env, property, &propertyValue);
        OH\_LOG\_INFO(LOG\_APP, "second private property set: %{public}d\\n", propertyValue);
        OH\_JSVM\_CloseHandleScope(env, handleScope);
    }

    OH\_JSVM\_CloseHandleScope(env, outerScope);
    return nullptr;
}

static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = privateTest},
};

static JSVM\_CallbackStruct \*method = param;

// wrapperObject方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"privateTest", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};

// 样例测试JS
const char \*srcCallNative = R"JS(privateTest();)JS";

#### 预期输出结果

private property set: 1
private property deleted is undefined: 1
second private property set: 2