harmony 鸿蒙使用 JSVM-API 提供的 proxy 接口

  • 2025-06-12
  • 浏览 (6)

使用 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++语言交互开发流程,本文仅对接口对应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

你可能感兴趣的鸿蒙文章

harmony 鸿蒙napi

harmony 鸿蒙使用命令行CMake构建NDK工程

harmony 鸿蒙使用DevEco Studio模板构建NDK工程

harmony 鸿蒙NDK工程构建概述

harmony 鸿蒙在NDK工程中使用预构建库

harmony 鸿蒙C/C++标准库机制概述

harmony 鸿蒙CPU特性

harmony 鸿蒙创建NDK工程

harmony 鸿蒙C/C++内存错误检测

harmony 鸿蒙通过DevEco Studio调试

0  赞