Node8.0之Napi探秘(二)

admin 2022年5月29日21:18:08评论645 views字数 5943阅读19分48秒阅读模式

关于JavaScript值的抽象操作

  • napi_coerce_to_bool

    napi_status napi_coerce_to_bool(napi_env env,napi_value value,napi_value* result)

    对于JavaScript中的ToBoolean操作的一个实现

  • napi_coerce_to_number

    napi_status napi_coerce_to_number(napi_env env,napi_value value,napi_value* result)

    对于JavaScript中的ToNumber操作的一个实现

  • napi_coerce_to_object

    napi_status napi_coerce_to_object(napi_env env,napi_value value,napi_value* result)

    对于JavaScript中的ToObject操作的一个实现

  • napi_coerce_to_string

    napi_status napi_coerce_to_string(napi_env env,napi_value value,napi_value* result)

    对于JavaScript中的ToString操作的一个实现

  • napi_typeof

    napi_status napi_typeof(napi_env env, napi_value value, napi_valuetype* result)

    对于JavaScript中的typeof操作的一个实现

  • napi_instanceof

    napi_status napi_instanceof(napi_env env,napi_value object,napi_value constructor,bool* result)

    对于JavaScript中的instanceof操作的一个实现

  • napi_is_array

    napi_status napi_is_array(napi_env env, napi_value value, bool* result)

    对于JavaScript中的isArrat函数的一个实现

  • napi_is_arraybuffer

    napi_status napi_is_arraybuffer(napi_env env, napi_value value, bool* result)

  • napi_is_buffer

    napi_status napi_is_buffer(napi_env env, napi_value value, bool* result)

  • napi_is_error

    napi_status napi_is_error(napi_env env, napi_value value, bool* result)

  • napi_is_typedarray

    napi_status napi_is_typedarray(napi_env env, napi_value value, bool* result)

  • napi_strict_equals

    napi_status napi_strict_equals(napi_env env,napi_value lhs,napi_value rhs,bool* result)

    比较传入的左值和右值是否严格相等

关于JavaScript中的属性

在JavaScript中,属性一般为键和值的元组,napi中所有属性键都可以用一下形式表示:

命名:一个简单的utf8字符串

整数索引:一个unit32_t表示的索引值

JavaScript值:在napi中有napi_value表示

官方示例:

比如如下JavaScript代码:

Node8.0之Napi探秘(二)

转化成napi模式变成了这样:

Node8.0之Napi探秘(二)

索引值的demo

Node8.0之Napi探秘(二)

复杂对象的demo

Node8.0之Napi探秘(二)

napi的格式为:

Node8.0之Napi探秘(二)

相关结构体

napi_property_attributes

该结构体是用于控制JavaScript对象上设置的属性的行为的标志的,每个属性的示例参见官方传送门

Node8.0之Napi探秘(二)

napi_property_descriptor

Node8.0之Napi探秘(二)

该结构体用来描述复杂对象具体的属性,每个参数的含义参见官方 传送门

相关函数

  • napi_get_property_names

    napi_status napi_get_property_names(napi_env env,napi_value object,napi_value* result);

    相当于es6中的keys函数

  • napi_set_property

    napi_status napi_set_property(napi_env env,napi_value object,napi_value key,napi_value value);

    为对象的某个属性赋值

  • napi_get_property

    napi_status napi_get_property(napi_env env,napi_value object,napi_value key,napi_value* result);

    获取对象某个属性的值

  • napi_has_property

    napi_status napi_has_property(napi_env env,napi_value object,napi_value key,bool* result);

    检测该对象是否存在对应的键

  • napi_set_named_property

    napi_status napi_set_named_property(napi_env env,napi_value object,const char* utf8Name,napi_value value);

    等价于直接调用napi_set_property,不过限定了字符串为键名的情况

  • napi_get_named_property

    napi_status napi_get_named_property(napi_env env,napi_value object,const char utf8Name,napi_value result);

    等价于调用napi_get_property,限定于字符串为键名的情况

  • napi_has_named_property

    napi_status napi_has_named_property(napi_env env,napi_value object,const char utf8Name,bool result);

    等价于调用napi_has_property,限定于字符串键名情况

  • napi_set_element

    napi_status napi_set_element(napi_env env,napi_value object,uint32_t index,napi_value value);

    为一个对象设置索引键属性

  • napi_get_element

    napi_status napi_get_element(napi_env env,napi_value object,uint32_t index,napi_value* result);

    获取一个对象的索引属性

  • napi_has_element

    napi_status napi_has_element(napi_env env,napi_value object,uint32_t index,bool* result);

    查询函数是否包含某个索引
  • napi_define_properties

    napi_status napi_define_properties(napi_env env,napi_value object,size_t property_count,const napi_property_descriptor* properties);

  • 这个函数用于高效的创建复杂对象,传入napi_property_descriptor数组,用于创建复杂对象

    JavaScript函数相关

Napi提供了一些列的api,来允许JavaScript调用本机代码,使用napi_callback类型表示回调函数。这类api允许回调函数进行一下操作:

  • 获取有关调用回调的上下文信息

  • 获取传入回调的参数

  • 从回调中返回一个napi_value

另外,napi还提供了一组允许本地代码调用JavaScript函数的函数,可以调用像常规JavaScript函数或作为构造函数的函数

  • napi_call_function

    napi_status napi_call_function(napi_env env,napi_value recv,napi_value func,int argc,const napi_value argv,napi_value result)

    该函数用于调用js函数,比如以下示例,便是从全局对象中获取了全局js函数,并调用。

  • 假设全局存在以下函数:

Node8.0之Napi探秘(二)

然后在下面的代码中调用:

Node8.0之Napi探秘(二)

napi_create_function

napi_status napi_create_function(napi_env env,const char utf8name,napi_callback cb,void data,napi_value* result);

该函数用于创建一个js中可以调用的函数,示例如下:

Node8.0之Napi探秘(二)

napi_get_cb_info

napi_status napi_get_cb_info(napi_env env,napi_callback_info cbinfo,size_t argc,napi_value argv,napi_value thisArg,void* data)

该函数用于在回调函数中从给定的回调信息中检索有关调用的详细信息

  • napi_is_construct_call

    napi_status napi_is_construct_call(napi_env env,napi_callback_info cbinfo,bool* result)

    该函数用于检测当前回调是否由构造器调用

  • napi_new_instance

    napi_status napi_new_instance(napi_env env,napi_value cons,size_t argc,napi_value argv,napi_value result)

    该函数用于使用给定的napi_value来实例化一个新的JavaScript值,该值代表该对象的构造函数。示例如下:

Node8.0之Napi探秘(二)

  • 在napi中使用该构造函数大致就是这样:

Node8.0之Napi探秘(二)

  • napi_make_callback

    napi_status napi_make_callback(napi_env env,napi_value recv,napi_value func,int argc,const napi_value argv,napi_value result)

    该方法允许从本机插件调用JavaScript函数对象。 这个API类似于napi_call_function。 但是,当从异步操作返回时(当堆栈中没有其他脚本)时,它用于从本机代码调用回JavaScript

    对象包裹

  • napi提供了一种”包装”C++类和实例的方法,以便于在JavaScript中调用类构造函数和方法.
    napi_define_class api定义了一个具有构造函数、静态属性和方法的JavaScript类,以及与c++类对应的实例属性和方法。当JavaScript调用构造函数时,会使用napi_wrap将一个新的c++实例包装在一个JavaScript对像中,然后返回包装对象,当访问对应的方法或属性访问器时,调用相应的napi_callback C++函数。
    ps:由于对象包裹的内容很麻烦,所以并未在本文中探讨

  • napi_define_class

    napi_status napi_define_class(napi_env env,

    const char* utf8name, napi_callback constructor, void* data, size_t property_count, const napi_property_descriptor* properties, napi_value* result);
  • napi_wrap

    napi_status napi_wrap(napi_env env,

    napi_value js_object, void* native_object, napi_finalize finalize_cb, void* finalize_hint, napi_ref* result);
  • napi_unwrap

    napi_status napi_unwrap(napi_env env,napi_value js_object,void** result);

    关于异步操作

  • 在napi中实现了一系列函数用于管理异步操作,使用napi_create_async_work和napi_delete_async_work创建/删除实例。
    其中执行回调会完成回调分别是在程序准备执行时以及执行完成时所调用的函数:

  • typedef void (napi_async_execute_callback)(napi_env env,void data);

    typedef void (napi_async_complete_callback)(napi_env env,napi_status status,void data);

  • 其中 参数data是调用napi_create_async_work时所传递的数据。
    创建后可以使用napi_queue_async_work函数让异步工作队列排队执行

  • NAPI_EXTERN napi_status napi_queue_async_work(napi_env env,napi_async_work work);

  • napi_create_async_work

    NAPI_EXTERN
    napi_status napi_create_async_work(napi_env env,napi_async_execute_callback execute,napi_async_complete_callback complete,void data,napi_async_work result);

  • napi_delete_async_work

    NAPI_EXTERN napi_status napi_delete_async_work(napi_env env,napi_async_work work);

  • napi_cancel_async_work

    NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env,napi_async_work work)
    ;

原文始发于微信公众号(三叶草小组Syclover):Node8.0之Napi探秘(二)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月29日21:18:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Node8.0之Napi探秘(二)http://cn-sec.com/archives/948502.html

发表评论

匿名网友 填写信息