| # Object Wrap | |
| Class `Napi::ObjectWrap<T>` inherits from class [`Napi::InstanceWrap<T>`][]. | |
| The `Napi::ObjectWrap<T>` class is used to bind the lifetime of C++ code to a | |
| JavaScript object. Once bound, each time an instance of the JavaScript object | |
| is created, an instance of the C++ class will also be created. When a method | |
| is called on the JavaScript object which is defined as an InstanceMethod, the | |
| corresponding C++ method on the wrapped C++ class will be invoked. | |
| In order to create a wrapper it's necessary to extend the | |
| `Napi::ObjectWrap<T>` class which contains all the plumbing to connect | |
| JavaScript code with a C++ object. Classes extending `Napi::ObjectWrap` can be | |
| instantiated from JavaScript using the **new** operator, and their methods can | |
| be directly invoked from JavaScript. The **wrap** word refers to a way of | |
| grouping methods and state of the class because it will be necessary write | |
| custom code to bridge each of your C++ class methods. | |
| **Caution:** When the JavaScript object is garbage collected, the call to the | |
| C++ destructor may be deferred until a later time. Within that period, | |
| `Value()` will return an empty value. | |
| ## Example | |
| ```cpp | |
| #include <napi.h> | |
| class Example : public Napi::ObjectWrap<Example> { | |
| public: | |
| static Napi::Object Init(Napi::Env env, Napi::Object exports); | |
| Example(const Napi::CallbackInfo& info); | |
| static Napi::Value CreateNewItem(const Napi::CallbackInfo& info); | |
| private: | |
| double _value; | |
| Napi::Value GetValue(const Napi::CallbackInfo& info); | |
| Napi::Value SetValue(const Napi::CallbackInfo& info); | |
| }; | |
| Napi::Object Example::Init(Napi::Env env, Napi::Object exports) { | |
| // This method is used to hook the accessor and method callbacks | |
| Napi::Function func = DefineClass(env, "Example", { | |
| InstanceMethod<&Example::GetValue>("GetValue", static_cast<napi_property_attributes>(napi_writable | napi_configurable)), | |
| InstanceMethod<&Example::SetValue>("SetValue", static_cast<napi_property_attributes>(napi_writable | napi_configurable)), | |
| StaticMethod<&Example::CreateNewItem>("CreateNewItem", static_cast<napi_property_attributes>(napi_writable | napi_configurable)), | |
| }); | |
| Napi::FunctionReference* constructor = new Napi::FunctionReference(); | |
| // Create a persistent reference to the class constructor. This will allow | |
| // a function called on a class prototype and a function | |
| // called on instance of a class to be distinguished from each other. | |
| *constructor = Napi::Persistent(func); | |
| exports.Set("Example", func); | |
| // Store the constructor as the add-on instance data. This will allow this | |
| // add-on to support multiple instances of itself running on multiple worker | |
| // threads, as well as multiple instances of itself running in different | |
| // contexts on the same thread. | |
| // | |
| // By default, the value set on the environment here will be destroyed when | |
| // the add-on is unloaded using the `delete` operator, but it is also | |
| // possible to supply a custom deleter. | |
| env.SetInstanceData<Napi::FunctionReference>(constructor); | |
| return exports; | |
| } | |
| Example::Example(const Napi::CallbackInfo& info) : | |
| Napi::ObjectWrap<Example>(info) { | |
| Napi::Env env = info.Env(); | |
| // ... | |
| Napi::Number value = info[0].As<Napi::Number>(); | |
| this->_value = value.DoubleValue(); | |
| } | |
| Napi::Value Example::GetValue(const Napi::CallbackInfo& info){ | |
| Napi::Env env = info.Env(); | |
| return Napi::Number::New(env, this->_value); | |
| } | |
| Napi::Value Example::SetValue(const Napi::CallbackInfo& info){ | |
| Napi::Env env = info.Env(); | |
| // ... | |
| Napi::Number value = info[0].As<Napi::Number>(); | |
| this->_value = value.DoubleValue(); | |
| return this->GetValue(info); | |
| } | |
| // Initialize native add-on | |
| Napi::Object Init (Napi::Env env, Napi::Object exports) { | |
| Example::Init(env, exports); | |
| return exports; | |
| } | |
| // Create a new item using the constructor stored during Init. | |
| Napi::Value Example::CreateNewItem(const Napi::CallbackInfo& info) { | |
| // Retrieve the instance data we stored during `Init()`. We only stored the | |
| // constructor there, so we retrieve it here to create a new instance of the | |
| // JS class the constructor represents. | |
| Napi::FunctionReference* constructor = | |
| info.Env().GetInstanceData<Napi::FunctionReference>(); | |
| return constructor->New({ Napi::Number::New(info.Env(), 42) }); | |
| } | |
| // Register and initialize native add-on | |
| NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init) | |
| ``` | |
| The above code can be used from JavaScript as follows: | |
| ```js | |
| 'use strict' | |
| const { Example } = require('bindings')('addon') | |
| const example = new Example(11) | |
| console.log(example.GetValue()) | |
| // It prints 11 | |
| example.SetValue(19) | |
| console.log(example.GetValue()); | |
| // It prints 19 | |
| ``` | |
| At initialization time, the `Napi::ObjectWrap::DefineClass()` method must be | |
| used to hook up the accessor and method callbacks. It takes a list of property | |
| descriptors, which can be constructed via the various static methods on the base | |
| class. | |
| When JavaScript code invokes the constructor, the constructor callback will | |
| create a new C++ instance and "wrap" it into the newly created JavaScript | |
| object. | |
| When JavaScript code invokes a method or a property accessor on the class the | |
| corresponding C++ callback function will be executed. | |
| For a wrapped object it could be difficult to distinguish between a function | |
| called on a class prototype and a function called on instance of a class. | |
| Therefore it is good practice to save a persistent reference to the class | |
| constructor. This allows the two cases to be distinguished from each other by | |
| checking the this object against the class constructor. | |
| ## Methods | |
| ### Constructor | |
| Creates a new instance of a JavaScript object that wraps native instance. | |
| ```cpp | |
| Napi::ObjectWrap(const Napi::CallbackInfo& callbackInfo); | |
| ``` | |
| - `[in] callbackInfo`: The object representing the components of the JavaScript | |
| request being made. | |
| ### Unwrap | |
| Retrieves a native instance wrapped in a JavaScript object. | |
| ```cpp | |
| static T* Napi::ObjectWrap::Unwrap(Napi::Object wrapper); | |
| ``` | |
| * `[in] wrapper`: The JavaScript object that wraps the native instance. | |
| Returns a native instance wrapped in a JavaScript object. Given the | |
| `Napi::Object`, this allows a method to get a pointer to the wrapped | |
| C++ object and then reference fields, call methods, etc. within that class. | |
| In many cases calling Unwrap is not required, as methods can | |
| use the `this` field for ObjectWrap when running in a method on a | |
| class that extends ObjectWrap. | |
| ### DefineClass | |
| Defnines a JavaScript class with constructor, static and instance properties and | |
| methods. | |
| ```cpp | |
| static Napi::Function Napi::ObjectWrap::DefineClass(Napi::Env env, | |
| const char* utf8name, | |
| const std::initializer_list<PropertyDescriptor>& properties, | |
| void* data = nullptr); | |
| ``` | |
| * `[in] env`: The environment in which to construct a JavaScript class. | |
| * `[in] utf8name`: Null-terminated string that represents the name of the | |
| JavaScript constructor function. | |
| * `[in] properties`: Initializer list of class property descriptor describing | |
| static and instance properties and methods of the class. | |
| See: [`Class property and descriptor`](class_property_descriptor.md). | |
| * `[in] data`: User-provided data passed to the constructor callback as `data` | |
| property of the `Napi::CallbackInfo`. | |
| Returns a `Napi::Function` representing the constructor function for the class. | |
| ### DefineClass | |
| Defnines a JavaScript class with constructor, static and instance properties and | |
| methods. | |
| ```cpp | |
| static Napi::Function Napi::ObjectWrap::DefineClass(Napi::Env env, | |
| const char* utf8name, | |
| const std::vector<PropertyDescriptor>& properties, | |
| void* data = nullptr); | |
| ``` | |
| * `[in] env`: The environment in which to construct a JavaScript class. | |
| * `[in] utf8name`: Null-terminated string that represents the name of the | |
| JavaScript constructor function. | |
| * `[in] properties`: Vector of class property descriptor describing static and | |
| instance properties and methods of the class. | |
| See: [`Class property and descriptor`](class_property_descriptor.md). | |
| * `[in] data`: User-provided data passed to the constructor callback as `data` | |
| property of the `Napi::CallbackInfo`. | |
| Returns a `Napi::Function` representing the constructor function for the class. | |
| ### OnCalledAsFunction | |
| Provides an opportunity to customize the behavior when a `Napi::ObjectWrap<T>` | |
| class is called from JavaScript as a function (without the **new** operator). | |
| The default behavior in this scenario is to throw a `Napi::TypeError` with the | |
| message `Class constructors cannot be invoked without 'new'`. Define this | |
| public method on your derived class to override that behavior. | |
| For example, you could internally re-call the JavaScript contstructor _with_ | |
| the **new** operator (via | |
| `Napi::Function::New(const std::vector<napi_value> &args)`), and return the | |
| resulting object. Or you might do something else entirely, such as the way | |
| [`Date()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#constructor) | |
| produces a string when called as a function. | |
| ```cpp | |
| static Napi::Value OnCalledAsFunction(const Napi::CallbackInfo& callbackInfo); | |
| ``` | |
| - `[in] callbackInfo`: The object representing the components of the JavaScript | |
| request being made. | |
| ### Finalize | |
| Provides an opportunity to run cleanup code that only utilizes basic Node APIs, if any. | |
| Override to implement. See [Finalization][] for more details. | |
| ```cpp | |
| virtual void Finalize(Napi::BasicEnv env); | |
| ``` | |
| - `[in] env`: `Napi::Env`. | |
| ### Finalize | |
| Provides an opportunity to run cleanup code that utilizes non-basic Node APIs. | |
| Override to implement. | |
| *NOTE*: Defining this method causes the deletion of the underlying `T* data` to | |
| be postponed until _after_ the garbage collection cycle. Since an `Napi::Env` | |
| has access to non-basic Node APIs, it cannot run in the same current tick as the | |
| garbage collector. | |
| ```cpp | |
| virtual void Finalize(Napi::Env env); | |
| ``` | |
| - `[in] env`: `Napi::Env`. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod( | |
| const char* utf8name, | |
| StaticVoidMethodCallback method, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] utf8name`: Null-terminated string that represents the name of a static | |
| method for the class. | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents the static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod( | |
| const char* utf8name, | |
| StaticMethodCallback method, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] utf8name`: Null-terminated string that represents the name of a static | |
| method for the class. | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod(Symbol name, | |
| StaticVoidMethodCallback method, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] name`: Napi::Symbol that represents the name of a static | |
| method for the class. | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents the static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod(Symbol name, | |
| StaticMethodCallback method, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| method for the class. | |
| - `[in] name`: Napi::Symbol that represents the name of a static. | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| template <StaticVoidMethodCallback method> | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod( | |
| const char* utf8name, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. This function returns nothing. | |
| - `[in] utf8name`: Null-terminated string that represents the name of a static | |
| method for the class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents the static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| template <StaticMethodCallback method> | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod( | |
| const char* utf8name, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] utf8name`: Null-terminated string that represents the name of a static | |
| method for the class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| template <StaticVoidMethodCallback method> | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod(Symbol name, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] name`: Napi::Symbol that represents the name of a static | |
| method for the class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents the static method of a | |
| JavaScript class. | |
| ### StaticMethod | |
| Creates property descriptor that represents a static method of a JavaScript | |
| class. | |
| ```cpp | |
| template <StaticMethodCallback method> | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticMethod(Symbol name, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] method`: The native function that represents a static method of a | |
| JavaScript class. | |
| - `[in] name`: Napi::Symbol that represents the name of a static. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into method when it is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static method of a | |
| JavaScript class. | |
| ### StaticAccessor | |
| Creates property descriptor that represents a static accessor property of a | |
| JavaScript class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticAccessor( | |
| const char* utf8name, | |
| StaticGetterCallback getter, | |
| StaticSetterCallback setter, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] utf8name`: Null-terminated string that represents the name of a static | |
| accessor property for the class. | |
| - `[in] getter`: The native function to call when a get access to the property | |
| of a JavaScript class is performed. | |
| - `[in] setter`: The native function to call when a set access to the property | |
| of a JavaScript class is performed. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into getter or setter when | |
| is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static accessor | |
| property of a JavaScript class. | |
| ### StaticAccessor | |
| Creates property descriptor that represents a static accessor property of a | |
| JavaScript class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticAccessor(Symbol name, | |
| StaticGetterCallback getter, | |
| StaticSetterCallback setter, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] name`: Napi::Symbol that represents the name of a static accessor. | |
| - `[in] getter`: The native function to call when a get access to the property | |
| of a JavaScript class is performed. | |
| - `[in] setter`: The native function to call when a set access to the property | |
| of a JavaScript class is performed. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into getter or setter when | |
| is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static accessor | |
| property of a JavaScript class. | |
| ### StaticAccessor | |
| Creates property descriptor that represents a static accessor property of a | |
| JavaScript class. | |
| ```cpp | |
| template <StaticGetterCallback getter, StaticSetterCallback setter=nullptr> | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticAccessor( | |
| const char* utf8name, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] getter`: The native function to call when a get access to the property | |
| of a JavaScript class is performed. | |
| - `[in] setter`: The native function to call when a set access to the property | |
| of a JavaScript class is performed. | |
| - `[in] utf8name`: Null-terminated string that represents the name of a static | |
| accessor property for the class. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into getter or setter when | |
| is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static accessor | |
| property of a JavaScript class. | |
| ### StaticAccessor | |
| Creates property descriptor that represents a static accessor property of a | |
| JavaScript class. | |
| ```cpp | |
| template <StaticGetterCallback getter, StaticSetterCallback setter=nullptr> | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticAccessor(Symbol name, | |
| napi_property_attributes attributes = napi_default, | |
| void* data = nullptr); | |
| ``` | |
| - `[in] getter`: The native function to call when a get access to the property | |
| of a JavaScript class is performed. | |
| - `[in] setter`: The native function to call when a set access to the property | |
| of a JavaScript class is performed. | |
| - `[in] name`: Napi::Symbol that represents the name of a static accessor. | |
| - `[in] attributes`: The attributes associated with a particular property. | |
| One or more of `napi_property_attributes`. | |
| - `[in] data`: User-provided data passed into getter or setter when | |
| is invoked. | |
| Returns `Napi::PropertyDescriptor` object that represents a static accessor | |
| property of a JavaScript class. | |
| ### StaticValue | |
| Creates property descriptor that represents an static value property of a | |
| JavaScript class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticValue( | |
| const char* utf8name, | |
| Napi::Value value, | |
| napi_property_attributes attributes = napi_default); | |
| ``` | |
| - `[in] utf8name`: Null-terminated string that represents the name of the static | |
| property. | |
| - `[in] value`: The value that's retrieved by a get access of the property. | |
| - `[in] attributes`: The attributes to be associated with the property in | |
| addition to the napi_static attribute. One or more of | |
| `napi_property_attributes`. | |
| Returns `Napi::PropertyDescriptor` object that represents an static value | |
| property of a JavaScript class | |
| ### StaticValue | |
| Creates property descriptor that represents an static value property of a | |
| JavaScript class. | |
| ```cpp | |
| static Napi::PropertyDescriptor Napi::ObjectWrap::StaticValue(Symbol name, | |
| Napi::Value value, | |
| napi_property_attributes attributes = napi_default); | |
| ``` | |
| - `[in] name`: The `Napi::Symbol` object whose value is used to identify the | |
| name of the static property. | |
| - `[in] value`: The value that's retrieved by a get access of the property. | |
| - `[in] attributes`: The attributes to be associated with the property in | |
| addition to the napi_static attribute. One or more of | |
| `napi_property_attributes`. | |
| Returns `Napi::PropertyDescriptor` object that represents an static value | |
| property of a JavaScript class | |
| [`Napi::InstanceWrap<T>`]: ./instance_wrap.md | |
| [Finalization]: ./finalization.md |