1# 使用Node-API接口设置ArkTS对象的属性 2<!--Kit: NDK--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @xliu-huanwei; @shilei123; @huanghello--> 5<!--Designer: @shilei123--> 6<!--Tester: @kirl75; @zsw_zhushiwei--> 7<!--Adviser: @fang-jinxu--> 8 9## 简介 10 11使用Node-API接口获取和设置ArkTS对象的属性,实现更复杂的功能和逻辑。 12 13## 基本概念 14 15处理ArkTS对象属性,确保正确访问、设置、删除属性,并了解属性的继承关系和枚举特性。以下是一些关键概念: 16 17- **对象(Object)**:在ArkTS中,对象是一种复合数据类型,它允许存储多个不同类型的值作为一个单独的实体。对象是属性和方法的集合。属性是与对象相关联的值,而方法则是对象可以执行的操作。 18- **属性(Property)**:在ArkTS中,属性是对象特征的键值对。每个属性都有一个名字(也称为键或标识符)和一个值。属性的值可以是任意数据类型,包括基本类型、对象和函数。 19- **可枚举属性(EnumerableProperty)**:在ArkTS中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的,即内部 “可枚举” 标志设置为true或false。可枚举性决定了这个属性能否被 `for...in` 查找遍历到。 20- **自有属性(OwnProperty)**:自有属性直接定义在对象上的属性,而不是从原型链上继承来的属性。 21 22## 场景和功能介绍 23 24以下Node-API接口提供了对ArkTS对象属性的操作,包括设置、获取、删除和检查属性是否存在。使用场景如下: 25| 接口 | 描述 | 26| -------- | -------- | 27| napi_get_property_names | 在进行对象操作或调试时,有时需要获取对象的属性和属性名。此接口可以提取对象的属性名,用于动态获取对象的属性信息。 | 28| napi_set_property | 此接口可以动态地向对象添加属性。也可修改对象的属性值,满足动态属性值变更的需求。 | 29| napi_get_property | 在调用Node-API模块的函数或方法时,可能需要将ArkTS对象的属性值作为参数传递。此接口可以获取属性值,并将其传递给其他函数。 | 30| napi_has_property | 在进行属性访问之前,通常需要先检查对象中是否存在指定的属性。此接口可以检查对象中是否存在指定的属性,避免访问不存在属性导致的异常。 | 31| napi_delete_property | 此函数用于删除ArkTS对象上的属性。 | 32| napi_has_own_property | 此函数用于检查ArkTS对象是否直接拥有(而不是从其原型链上继承)某个属性。 | 33| napi_set_named_property | 此函数用于将值赋给ArkTS对象的命名属性。 | 34| napi_get_named_property | 此函数用于获取ArkTS对象的命名属性值。 | 35| napi_has_named_property | 此函数用于检查ArkTS对象是否包含某个命名属性。 | 36| napi_define_properties | 此函数可以在指定的Object中自定义属性,从ArkTS访问和操作这些属性。 | 37| napi_get_all_property_names | 此接口可以获取对象的所有属性名称,检查是否包含特定属性名。 | 38 39## 使用示例 40 41Node-API接口开发流程可参考[使用Node-API实现跨语言交互开发流程](use-napi-process.md),本文展示接口对应C++及ArkTS代码。 42 43### napi_get_property_names 44 45以字符串数组的形式获取对象的可枚举属性的名称。 46 47cpp部分代码 48 49```cpp 50#include "napi/native_api.h" 51 52static napi_value GetPropertyNames(napi_env env, napi_callback_info info) 53{ 54 // 解析ArkTS的传参 55 size_t argc = 1; 56 napi_value args[1] = {nullptr}; 57 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 58 // 以字符串数组的形式获取对象的可枚举属性的名称,以result传出 59 napi_value result; 60 napi_status status = napi_get_property_names(env, args[0], &result); 61 if (status != napi_ok) { 62 napi_throw_error(env, nullptr, "Node-API napi_get_property_names fail"); 63 return nullptr; 64 } 65 return result; 66} 67``` 68<!-- @[napi_get_property_names](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 69 70接口声明 71 72```ts 73// index.d.ts 74export const getPropertyNames: (obj: Object) => Array<string> | undefined; 75``` 76<!-- @[napi_get_property_names_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 77 78ArkTS侧示例代码 79 80```ts 81import hilog from '@ohos.hilog'; 82import testNapi from 'libentry.so'; 83try { 84 class Obj { 85 data: number = 0 86 message: string = "" 87 } 88 let obj: Obj = { data: 0, message: "hello world"}; 89 let propertyNames = testNapi.getPropertyNames(obj); 90 if (Array.isArray(propertyNames) && propertyNames.length > 0) { 91 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_property_names: %{public}s', propertyNames[0]); 92 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_property_names: %{public}s', propertyNames[1]); 93 } 94} catch (error) { 95 hilog.error(0x0000, 'testTag', 'Test Node-API napi_get_property_names error: %{public}s', error.message); 96} 97``` 98<!-- @[ark_napi_get_property_names](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 99 100### napi_set_property 101 102将给定的属性与值设置入给定的Object。 103 104cpp部分代码 105 106```cpp 107#include "napi/native_api.h" 108 109static constexpr int INT_ARG_2 = 2; // 入参索引 110 111static napi_value SetProperty(napi_env env, napi_callback_info info) 112{ 113 // 接收ArkTS侧传入的三个参数:第一个参数为想要设置的object,第二个参数为属性,第三个参数为属性对应的值 114 size_t argc = 3; 115 napi_value args[3] = {nullptr}; 116 napi_status status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 117 if (status != napi_ok) { 118 napi_throw_error(env, nullptr, "Node-API napi_get_cb_info fail"); 119 return nullptr; 120 } 121 // 通过调用napi_set_property接口将属性与值设置入object,如果失败,直接抛出错误 122 status = napi_set_property(env, args[0], args[1], args[INT_ARG_2]); 123 if (status != napi_ok) { 124 napi_throw_error(env, nullptr, "Node-API napi_set_property fail"); 125 return nullptr; 126 } 127 // 返回设置成功的object对象 128 return args[0]; 129} 130``` 131<!-- @[napi_set_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 132 133接口声明 134 135```ts 136// index.d.ts 137export const setProperty: (obj: Object, key: String, value: string) => Object | undefined; 138``` 139<!-- @[napi_set_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 140 141ArkTS侧示例代码 142 143```ts 144import hilog from '@ohos.hilog'; 145import testNapi from 'libentry.so'; 146try { 147 class Obj { 148 data: number = 0 149 message: string = "" 150 } 151 let obj: Obj = { data: 0, message: "hello world"}; 152 let result = testNapi.setProperty(obj, "code", "hi"); 153 hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_property: %{public}s', JSON.stringify(result)); 154} catch (error) { 155 hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_property error: %{public}s', error.message); 156} 157``` 158<!-- @[ark_napi_set_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 159 160### napi_get_property 161 162获取object指定的属性的值。 163 164cpp部分代码 165 166```cpp 167#include "napi/native_api.h" 168 169static napi_value GetProperty(napi_env env, napi_callback_info info) 170{ 171 // 接收两个ArkTS传来的参数 172 size_t argc = 2; 173 napi_value args[2] = {nullptr}; 174 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 175 // 传入的第一个参数为要检测的object,第二个对象为要检测的属性,通过调用napi_get_property接口获取对应的值 176 napi_value result; 177 napi_status status = napi_get_property(env, args[0], args[1], &result); 178 if (status != napi_ok) { 179 napi_throw_error(env, nullptr, "Node-API napi_get_property fail"); 180 return nullptr; 181 } 182 return result; 183} 184``` 185<!-- @[napi_get_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 186 187接口声明 188 189```ts 190// index.d.ts 191export const getProperty: (obj: Object, key: string) => string | undefined; 192``` 193<!-- @[napi_get_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 194 195ArkTS侧示例代码 196 197```ts 198import hilog from '@ohos.hilog'; 199import testNapi from 'libentry.so'; 200try { 201 class Obj { 202 data: number = 0 203 message: string = "" 204 } 205 let obj: Obj = { data: 0, message: "hello world"}; 206 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_property: %{public}s', testNapi.getProperty(obj, "message")); 207} catch (error) { 208 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_property error: %{public}s', error.message); 209} 210``` 211<!-- @[ark_napi_get_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 212 213### napi_has_property 214 215检查对象中是否存在指定的属性,避免访问不存在属性导致的异常。 216 217cpp部分代码 218 219```cpp 220#include "napi/native_api.h" 221 222static napi_value HasProperty(napi_env env, napi_callback_info info) 223{ 224 // 从ArkTS侧传入两个参数:第一个参数为要检验的对象,第二个参数为要检测是否存在对象的属性 225 size_t argc = 2; 226 napi_value args[2] = {nullptr}; 227 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 228 229 // 将参数传入napi_has_property方法中,若接口调用成功则将结果转化为napi_value类型抛出,否则抛出错误 230 bool result; 231 napi_status status = napi_has_property(env, args[0], args[1], &result); 232 if (status != napi_ok) { 233 napi_throw_error(env, nullptr, "Node-API napi_has_property fail"); 234 return nullptr; 235 } 236 237 // 若传入属性存在传入对象中,则输出true将结果转化为napi_value类型抛出 238 napi_value returnResult; 239 napi_get_boolean(env, result, &returnResult); 240 return returnResult; 241} 242``` 243<!-- @[napi_has_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 244 245接口声明 246 247```ts 248// index.d.ts 249export const hasProperty: (obj: Object, key: number | string) => boolean | undefined; 250``` 251<!-- @[napi_has_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 252 253ArkTS侧示例代码 254 255```ts 256import hilog from '@ohos.hilog'; 257import testNapi from 'libentry.so'; 258try { 259 class Obj { 260 data: number = 0 261 message: string = "" 262 } 263 let obj: Obj = { data: 0, message: "hello world"}; 264 let resultFalse = testNapi.hasProperty(obj, 0); 265 let resultTrue = testNapi.hasProperty(obj, "data"); 266 hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_property: %{public}s', JSON.stringify(resultFalse)); 267 hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_property: %{public}s', JSON.stringify(resultTrue)); 268} catch (error) { 269 hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_property error: %{public}s', error.message); 270} 271``` 272<!-- @[ark_napi_has_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 273 274### napi_delete_property 275 276尝试从给定的Object中删除由key指定的属性,并返回操作的结果。 277如果对象不可扩展或属性不可配置,则可能无法删除该属性。 278 279cpp部分代码 280 281```cpp 282#include "napi/native_api.h" 283 284// 从传入的Object对象中删除指定属性,返回是否删除成功的bool结果值 285static napi_value DeleteProperty(napi_env env, napi_callback_info info) 286{ 287 // 接收两个ArkTS传来的参数 288 size_t argc = 2; 289 napi_value args[2] = {nullptr}; 290 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 291 292 napi_valuetype valueType; 293 napi_typeof(env, args[0], &valueType); 294 if (valueType != napi_object) { 295 napi_throw_error(env, nullptr, "Expects an object as argument."); 296 return nullptr; 297 } 298 // 删除指定属性,结果存储在result中 299 bool result = false; 300 napi_status status = napi_delete_property(env, args[0], args[1], &result); 301 if (status != napi_ok) { 302 napi_throw_error(env, nullptr, "Node-API napi_delete_property failed"); 303 return nullptr; 304 } 305 // 将bool结果转换为napi_value并返回 306 napi_value ret; 307 napi_get_boolean(env, result, &ret); 308 return ret; 309} 310``` 311<!-- @[napi_delete_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 312 313接口声明 314 315```ts 316// index.d.ts 317export const deleteProperty: (obj: Object, key:string) => boolean; 318``` 319<!-- @[napi_delete_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 320 321ArkTS侧示例代码 322 323```ts 324import hilog from '@ohos.hilog'; 325import testNapi from 'libentry.so'; 326class Obj { 327 first: number = 0; 328} 329let obj: Obj = { first: 1}; 330hilog.info(0x0000, 'testTag', 'Test Node-API napi_delete_property first: %{public}s', testNapi.deleteProperty(obj, 'first')); 331// 设置新的属性为不可配置 332// 这里的Object.defineProperty方法在DevEco Studio 4.1.0.400及其以上版本不支持,需在ts使用 333Object.defineProperty(obj, 'config', { 334 configurable: false, 335 value: "value" 336}) 337hilog.info(0x0000, 'testTag', 'Test Node-API napi_delete_property config: %{public}s', testNapi.deleteProperty(obj, 'config')); 338``` 339<!-- @[ark_napi_delete_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/napiDeleteProperty.ts) --> 340 341### napi_has_own_property 342 343用于检查传入的Object是否包含自己的命名属性,不包括从原型链上继承的属性。 344 345cpp部分代码 346 347```cpp 348#include "napi/native_api.h" 349 350static napi_value NapiHasOwnProperty(napi_env env, napi_callback_info info) 351{ 352 // 接收两个ArkTS传来的参数 353 size_t argc = 2; 354 napi_value args[2] = {nullptr}; 355 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 356 // 检查第一个参数是否为对象 357 napi_valuetype valueTypeObj; 358 napi_typeof(env, args[0], &valueTypeObj); 359 if (valueTypeObj != napi_object) { 360 napi_throw_error(env, nullptr, "First argument must be an object."); 361 return nullptr; 362 } 363 // 检查第二个参数是否为string 364 napi_valuetype valuetypeStr; 365 napi_typeof(env, args[1], &valuetypeStr); 366 if (valuetypeStr != napi_string) { 367 napi_throw_error(env, nullptr, "Second argument must be a string."); 368 return nullptr; 369 } 370 // 检查对象是否具有指定属性,结果存储在hasProperty中 371 bool hasProperty; 372 napi_status status = napi_has_own_property(env, args[0], args[1], &hasProperty); 373 if (status != napi_ok) { 374 napi_throw_error(env, nullptr, "napi_has_own_property failed"); 375 return nullptr; 376 } 377 // 将bool结果转换为napi_value并返回 378 napi_value result; 379 napi_get_boolean(env, hasProperty, &result); 380 return result; 381} 382``` 383<!-- @[napi_has_own_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 384 385接口声明 386 387```ts 388// index.d.ts 389export const napiHasOwnProperty: (obj: Object, key:string) => boolean | undefined; 390``` 391<!-- @[napi_has_own_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 392 393ArkTS侧示例代码 394 395```ts 396import hilog from '@ohos.hilog'; 397import testNapi from 'libentry.so'; 398 399let myObj = { 'myProperty': 1 }; 400let inheritedObj = { 'inheritedProperty': 2 }; 401// 这里的Object.setPrototypeOf方法在DevEco Studio 4.1.0.400及其以上版本不支持,需在ts使用 402Object.setPrototypeOf(myObj, inheritedObj); 403hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_own_property my: %{public}s', testNapi.napiHasOwnProperty(myObj, 'myProperty')); 404hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_own_property inherited: %{public}s', testNapi.napiHasOwnProperty(myObj, 'inheritedProperty')); 405``` 406<!-- @[ark_napi_has_own_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/napiHasOwnProperty.ts) --> 407 408### napi_set_named_property 409 410在传入的ArkTS对象上添加一个命名属性。 411 412cpp部分代码 413 414```cpp 415#include "napi/native_api.h" 416#include "hilog/log.h" 417 418static napi_value NapiSetNamedProperty(napi_env env, napi_callback_info info) 419{ 420 // 接收一个ArkTS传来的参数 421 size_t argc = 1; 422 napi_value str; 423 const int32_t strLength = 32; 424 char strKey[strLength] = ""; 425 napi_get_cb_info(env, info, &argc, &str, nullptr, nullptr); 426 // 获取传入参数字符串并存储在strKey中 427 size_t keyLength; 428 napi_status status = napi_get_value_string_utf8(env, str, strKey, strLength, &keyLength); 429 if (status != napi_ok) { 430 OH_LOG_ERROR(LOG_APP, "napi_get_value_string_utf8 failed"); 431 return nullptr; 432 } 433 // 创建一个新对象 434 napi_value newObj; 435 napi_create_object(env, &newObj); 436 // 设置整数值1234为属性值 437 int32_t value = 1234; 438 napi_value numValue; 439 napi_create_int32(env, value, &numValue); 440 // 将整数值与指定属性名关联 441 status = napi_set_named_property(env, newObj, strKey, numValue); 442 if (status != napi_ok) { 443 OH_LOG_ERROR(LOG_APP, "napi_set_named_property failed"); 444 return nullptr; 445 } 446 // 返回设置了命名属性的对象newObj 447 return newObj; 448} 449``` 450<!-- @[napi_set_named_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 451 452接口声明 453 454```ts 455// index.d.ts 456export const napiSetNamedProperty: (key: string) => Object | undefined; 457``` 458<!-- @[napi_set_named_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 459 460ArkTS侧示例代码 461 462```ts 463import hilog from '@ohos.hilog'; 464import testNapi from 'libentry.so'; 465 466let obj = testNapi.napiSetNamedProperty('myProperty'); 467let objAsString = JSON.stringify(obj); 468hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_named_property: %{public}s', objAsString); 469``` 470<!-- @[ark_napi_set_named_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 471 472### napi_get_named_property 473 474从ArkTS对象中获取命名属性的值。 475 476cpp部分代码 477 478```cpp 479#include "napi/native_api.h" 480 481static napi_value NapiGetNamedProperty(napi_env env, napi_callback_info info) 482{ 483 // 接收两个ArkTS传来的参数 484 size_t argc = 2; 485 napi_value args[2] = {nullptr}; 486 const int32_t strLength = 32; 487 char strKey[strLength] = ""; 488 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 489 // 获取要获取的属性名 490 size_t keyLength; 491 napi_get_value_string_utf8(env, args[1], strKey, strLength, &keyLength); 492 // 获取指定属性的值并存储在result中 493 napi_value result; 494 napi_status status = napi_get_named_property(env, args[0], strKey, &result); 495 if (status != napi_ok) { 496 napi_throw_error(env, nullptr, "napi_get_named_property failed"); 497 return nullptr; 498 } 499 // 返回result 500 return result; 501} 502``` 503<!-- @[napi_get_named_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 504 505接口声明 506 507```ts 508// index.d.ts 509export const napiGetNamedProperty: (obj: Object, key: string) => boolean | number | string | Object | undefined; 510``` 511<!-- @[napi_get_named_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 512 513ArkTS侧示例代码 514 515```ts 516import hilog from '@ohos.hilog'; 517import testNapi from 'libentry.so'; 518 519interface NestedObj { 520 nestedStr: string; 521 nestedNum: number; 522} 523class Obj { 524 str: string = ""; 525 num: number = 0; 526 bol: boolean = false; 527 nestedObj: NestedObj = { nestedStr: "", nestedNum: 0 }; 528} 529let obj: Obj = {str: "bar", num: 42, bol: true, 530 nestedObj: { nestedStr: "nestedValue", nestedNum: 123 }}; 531hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_named_property : %{public}s', testNapi.napiGetNamedProperty(obj, 'str')); 532hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_named_property : %{public}d', testNapi.napiGetNamedProperty(obj, 'num')); 533hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_named_property : %{public}s', testNapi.napiGetNamedProperty(obj, 'bol')); 534let nestedObj = testNapi.napiGetNamedProperty(obj, 'nestedObj'); 535let objAsString = JSON.stringify(nestedObj); 536hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_named_property : %{public}s', objAsString); 537hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_named_property : %{public}s', testNapi.napiGetNamedProperty(obj, 'null')); 538``` 539<!-- @[ark_napi_get_named_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 540 541### napi_has_named_property 542 543检查ArkTS对象中是否具有指定的命名属性。 544 545cpp部分代码 546 547```cpp 548#include "napi/native_api.h" 549 550static napi_value NapiHasNamedProperty(napi_env env, napi_callback_info info) 551{ 552 // 接收两个ArkTS传来的参数 553 size_t argc = 2; 554 napi_value args[2] = {nullptr}; 555 const int32_t strLength = 32; 556 char strKey[strLength] = ""; 557 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 558 // 获取要检查的属性名 559 size_t keyLength; 560 napi_get_value_string_utf8(env, args[1], strKey, strLength, &keyLength); 561 // 检查对象是否具有指定命名的属性,并将结果存储在hasProperty中 562 bool hasProperty = false; 563 napi_status status = napi_has_named_property(env, args[0], strKey, &hasProperty); 564 if (status != napi_ok) { 565 napi_throw_error(env, nullptr, "napi_has_named_property failed"); 566 return nullptr; 567 } 568 // 将bool结果转换为napi_value并返回 569 napi_value result; 570 napi_get_boolean(env, hasProperty, &result); 571 return result; 572} 573``` 574<!-- @[napi_has_named_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 575 576接口声明 577 578```ts 579// index.d.ts 580export const napiHasNamedProperty: (obj: Object, key:string) => boolean | undefined; 581``` 582<!-- @[napi_has_named_property_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 583 584ArkTS侧示例代码 585 586```ts 587import hilog from '@ohos.hilog'; 588import testNapi from 'libentry.so'; 589interface NestedObj { 590 nestedStr: string; 591 nestedNum: number; 592} 593class Obj { 594 str: string = ""; 595 num: number = 0; 596 bol: boolean = false; 597 nestedObj: NestedObj = { nestedStr: "", nestedNum: 0 }; 598} 599let obj: Obj = {str: "bar", num: 42, bol: true, 600 nestedObj: { nestedStr: "nestedValue", nestedNum: 123 }}; 601hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_named_property : %{public}s', testNapi.napiHasNamedProperty(obj, 'str')); 602hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_named_property : %{public}s', testNapi.napiHasNamedProperty(obj, 'nestedStr')); 603hilog.info(0x0000, 'testTag', 'Test Node-API napi_has_named_property : %{public}s', testNapi.napiHasNamedProperty(obj, 'bol')); 604``` 605<!-- @[ark_napi_has_named_property](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 606 607### napi_define_properties 608 609设置对象的属性。 610 611cpp部分代码 612 613```cpp 614#include <string> 615#include "napi/native_api.h" 616 617static napi_value DefineMethodPropertiesExample(napi_env env, napi_callback_info info) 618{ 619 // 创建一个int32类型的属性值 620 int32_t propValue = 26; 621 napi_value returnValue = nullptr; 622 napi_create_int32(env, propValue, &returnValue); 623 return returnValue; 624} 625// Getter回调函数 626static napi_value GetterCallback(napi_env env, napi_callback_info info) 627{ 628 napi_value result; 629 const char *str = u8"World!"; 630 size_t length = strlen(str); 631 // 创建属性的值 632 napi_create_string_utf8(env, str, length, &result); 633 return result; 634} 635 636// Setter回调函数 637static napi_value SetterCallback(napi_env env, napi_callback_info info) 638{ 639 // 获取传递给setter的参数 640 size_t argc = 1; 641 napi_value argv[1] = {nullptr}; 642 napi_value result; 643 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 644 size_t length = 0; 645 napi_get_value_string_utf8(env, argv[0], nullptr, 0, &length); 646 char* buf = new char[length + 1]; 647 std::memset(buf, 0, length + 1); 648 napi_get_value_string_utf8(env, argv[0], buf, length + 1, &length); 649 napi_create_string_utf8(env, buf, length, &result); 650 delete[] buf; 651 return result; 652} 653static napi_value DefineMethodProperties(napi_env env, napi_callback_info info) 654{ 655 napi_value obj; 656 napi_create_object(env, &obj); 657 // 在obj对象上定义了一个函数defineMethodPropertiesExample,在函数defineMethodPropertiesExample中定义了一个变量并返回,在调用obj的这个对象时可以调用这个函数 658 napi_property_descriptor descriptor[] = { 659 {"defineMethodPropertiesExample", nullptr, DefineMethodPropertiesExample, nullptr, nullptr, nullptr, napi_default, nullptr}}; 660 napi_define_properties(env, obj, sizeof(descriptor) / sizeof(descriptor[0]), descriptor); 661 return obj; 662} 663static napi_value DefineStringProperties(napi_env env, napi_callback_info info) 664{ 665 napi_value obj; 666 napi_create_object(env, &obj); 667 // 创建一个string类型的属性值 668 napi_value string_value; 669 napi_create_string_utf8(env, "Hello!", NAPI_AUTO_LENGTH, &string_value); 670 napi_property_descriptor descriptor[] = { 671 {"defineStringPropertiesExample", nullptr, nullptr, nullptr, nullptr, string_value, napi_default, nullptr}}; 672 napi_define_properties(env, obj, sizeof(descriptor) / sizeof(descriptor[0]), descriptor); 673 return obj; 674} 675 676static napi_value CreateStringWithGetterSetter(napi_env env, napi_callback_info info) 677{ 678 napi_value obj; 679 napi_create_object(env, &obj); 680 // 定义getter函数 681 napi_value getterFn; 682 napi_create_function(env, nullptr, 0, GetterCallback, nullptr, &getterFn); 683 napi_set_named_property(env, obj, "getterCallback", getterFn); 684 // 定义setter函数 685 napi_value setterFn; 686 napi_create_function(env, nullptr, 0, SetterCallback, nullptr, &setterFn); 687 napi_set_named_property(env, obj, "setterCallback", setterFn); 688 // 定义带有getter和setter的属性 689 napi_property_descriptor desc = {"defineGetterSetter", nullptr, nullptr, GetterCallback, SetterCallback, nullptr, napi_enumerable, nullptr}; 690 napi_define_properties(env, obj, 1, &desc); 691 return obj; 692} 693``` 694<!-- @[napi_define_properties](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 695 696接口声明 697 698```ts 699// index.d.ts 700export class DefineMethodObj { 701 defineMethodPropertiesExample: Function; 702} 703export class DefineStringObj { 704 defineStringPropertiesExample: string; 705} 706export class DefineGetterSetterObj { 707 getterCallback: Function; 708 setterCallback: Function; 709} 710export const defineMethodProperties: () => DefineMethodObj; 711export const defineStringProperties: () => DefineStringObj; 712export const createStringWithGetterSetter: () => DefineGetterSetterObj; 713``` 714<!-- @[napi_define_properties_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 715 716ArkTS侧示例代码 717 718```ts 719import hilog from '@ohos.hilog'; 720import testNapi from 'libentry.so'; 721// 定义method类型的属性 722hilog.info(0x0000, 'testTag', 'Test Node-API define_method_properties:%{public}d', testNapi.defineMethodProperties() 723 .defineMethodPropertiesExample()); 724// 定义string类型的属性 725hilog.info(0x0000, 'testTag', 'Test Node-API define_string_properties::%{public}s ', testNapi.defineStringProperties() 726 .defineStringPropertiesExample); 727// getter和setter 728hilog.info(0x0000, 'testTag', 'Test Node-API get::%{public}s ', testNapi.createStringWithGetterSetter() 729 .getterCallback()); 730hilog.info(0x0000, 'testTag', 'Test Node-API setter::%{public}s ', testNapi.createStringWithGetterSetter() 731 .setterCallback('set data')); 732``` 733<!-- @[ark_napi_define_properties](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 734 735### napi_get_all_property_names 736 737获取传入的ArkTS对象的所有属性名。 738 739cpp部分代码 740 741```cpp 742#include "napi/native_api.h" 743 744static napi_value GetAllPropertyNames(napi_env env, napi_callback_info info) 745{ 746 // 传入一个参数 747 size_t argc = 1; 748 napi_value args[1] = {nullptr}; 749 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 750 751 // 获取给定对象的所有属性名称 752 napi_value result; 753 napi_status status = napi_get_all_property_names(env, args[0], napi_key_own_only, napi_key_writable, 754 napi_key_numbers_to_strings, &result); 755 // 如果获取属性名失败,抛出一个错误 756 if (status != napi_ok) { 757 napi_throw_error(env, nullptr, "Node-API napi_get_all_property_names fail"); 758 return nullptr; 759 } 760 761 return result; 762} 763``` 764<!-- @[napi_get_all_property_names](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/napi_init.cpp) --> 765 766接口声明 767 768```ts 769// index.d.ts 770export const getAllPropertyNames : (obj: Object) => Array<string> | undefined; 771``` 772<!-- @[napi_get_all_property_names_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/cpp/types/libentry/Index.d.ts) --> 773 774ArkTS侧示例代码 775 776```ts 777import hilog from '@ohos.hilog'; 778import testNapi from 'libentry.so'; 779try { 780 class Obj { 781 data: number = 0 782 message: string = "" 783 } 784 let obj: Obj = { data: 0, message: "hello world"}; 785 let propertyNames = testNapi.getAllPropertyNames(obj); 786 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_all_property_names: %{public}s', JSON.stringify(propertyNames)); 787} catch (error) { 788 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_all_property_names error: %{public}s', error.message); 789} 790``` 791<!-- @[ark_napi_get_all_property_names](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIProperty/entry/src/main/ets/pages/Index.ets) --> 792 793以上代码如果要在native cpp中打印日志,需在CMakeLists.txt文件中添加以下配置信息(并添加头文件:#include "hilog/log.h"): 794 795```text 796// CMakeLists.txt 797add_definitions( "-DLOG_DOMAIN=0xd0d0" ) 798add_definitions( "-DLOG_TAG=\"testTag\"" ) 799target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so) 800``` 801