使用JSVM-API提供的proxy接口
====================

#### 简介

JSVM-API 提供了创建 Proxy、判断 JSVM\_Value 是否为 Proxy 类型和获取 Proxy 中的目标对象的接口。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_CreateProxy | 创建 Proxy，等价于在 js 中执行 new Proxy(target, handler) |
| OH\_JSVM\_IsProxy | 判断传入的 JSVM\_Value 是否为 Proxy 类型 |
| OH\_JSVM\_ProxyGetTarget | 获取给定 proxy 的目标对象 |

#### 使用示例

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

cpp 部分代码

// OH\_JSVM\_CreateProxy 的样例方法
static JSVM\_Value CreateProxy(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 接受两个入参，第 1 个参数为 target，第 2 个参数为 handler
    size\_t argc = 2;
    JSVM\_Value args\[2\] = {nullptr};
    JSVM\_CALL(OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
    // 用 OH\_JSVM\_CreateProxy 为目标对象创建代理
    JSVM\_Value result = nullptr;
    JSVM\_Status status = OH\_JSVM\_CreateProxy(env, args\[0\], args\[1\], &result);
    if (status != JSVM\_OK) {
        OH\_LOG\_ERROR(LOG\_APP, "JSVM OH\_JSVM\_CreateProxy: failed: %{public}d", status);
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM OH\_JSVM\_CreateProxy: success");
    }

    return result;
}

// OH\_JSVM\_IsProxy 的样例方法
static JSVM\_Value IsProxy(JSVM\_Env env, JSVM\_CallbackInfo info) {
    size\_t argc = 1;
    JSVM\_Value args\[1\] = {nullptr};
    JSVM\_CALL(OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
    // 调用 OH\_JSVM\_IsProxy 判断 JSVM\_Value 是否为代理
    bool result = false;
    JSVM\_Status status = OH\_JSVM\_IsProxy(env, args\[0\], &result);
    if (status != JSVM\_OK) {
        OH\_LOG\_ERROR(LOG\_APP, "JSVM OH\_JSVM\_IsProxy: failed");
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM OH\_JSVM\_IsProxy: success: %{public}s", result ? "is a proxy" : "is not a proxy");
    }
    JSVM\_Value isProxy;
    JSVM\_CALL(OH\_JSVM\_GetBoolean(env, result, &isProxy));
    return isProxy;
}

// OH\_JSVM\_ProxyGetTarget 的样例方法
static JSVM\_Value GetProxyTarget(JSVM\_Env env, JSVM\_CallbackInfo info) {
    size\_t argc = 1;
    JSVM\_Value args\[1\] = {nullptr};
    JSVM\_CALL(OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
    // 调用 OH\_JSVM\_ProxyGetTarget 获取代理中的目标对象
    JSVM\_Value result = nullptr;
    JSVM\_Status status = OH\_JSVM\_ProxyGetTarget(env, args\[0\], &result);
    if (status != JSVM\_OK) {
        OH\_LOG\_ERROR(LOG\_APP, "JSVM OH\_JSVM\_ProxyGetTarget: failed");
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM OH\_JSVM\_ProxyGetTarget: success");
    }

    return result;
}

// Proxy 相关回调注册
static JSVM\_CallbackStruct param\[\] = {{.data = nullptr, .callback = CreateProxy},
                                      {.data = nullptr, .callback = IsProxy},
                                      {.data = nullptr, .callback = GetProxyTarget}};
static JSVM\_CallbackStruct \*method = param;
// Proxy 相关回调别名
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"CreateProxy", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
    {"IsProxy", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
    {"GetProxyTarget", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT}};

const char \*srcCallNative = R"JS(
       target = {
         message1: "hello",
         message2: "everyone",
       };

       handler = {
         get(target, prop, receiver) {
           return "world";
         },
       };

       proxy = CreateProxy(target, handler)
       isProxy = IsProxy(proxy)
       target1 = GetProxyTarget(proxy)
)JS";

预期的输出结果

JSVM OH\_JSVM\_CreateProxy: success
JSVM OH\_JSVM\_IsProxy: success: is a proxy
JSVM OH\_JSVM\_ProxyGetTarget: success