• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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