Setting the private Property Using JSVM-API
Introduction
This topic walks you through on how to use JSVM-API to set a private property.
Basic Concepts
JSVM-API provides the capability of creating private keys, creating and deleting properties on objects using the keys, and persistently saving private key symbols.
Available APIs
| API | Description |
|---|---|
| OH_JSVM_CreateDataReference | Creates a data reference with a specified reference count in JSVM. |
| OH_JSVM_GetReferenceData | Checks whether a specified reference is valid. If the reference is valid, the JavaScript data associated with the reference is returned; otherwise, result is set to NULL. |
| OH_JSVM_CreatePrivate | Creates a JS private key object. |
| OH_JSVM_SetPrivate | Sets a private property for a passed-in object. |
| OH_JSVM_GetPrivate | Obtains the private property of an object based on the private key. |
| OH_JSVM_DeletePrivate | Deletes the private property of an object based on the private key. |
Example
If you are just starting out with JSVM-API, see JSVM-API Development Process. The following demonstrates only the C++ code involved in manipulating private properties.
Creating a private Key, adding a private Property, and Deleting the Property
CPP code:
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;
// Alias for the wrapperObject method to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"privateTest", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(privateTest();)JS";
Expected Result
private property set: 1
private property deleted is undefined: 1
second private property set: 2