From 60867fb030bae582082340ead7dbc7efdc2f5398 Mon Sep 17 00:00:00 2001 From: 8cy <50817549+8cy@users.noreply.github.com> Date: Fri, 3 Apr 2020 02:37:42 -0700 Subject: 2020/04/03, 02:34, v1.2.0 --- .../doc/class_property_descriptor.md | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 node_modules/node-addon-api/doc/class_property_descriptor.md (limited to 'node_modules/node-addon-api/doc/class_property_descriptor.md') diff --git a/node_modules/node-addon-api/doc/class_property_descriptor.md b/node_modules/node-addon-api/doc/class_property_descriptor.md new file mode 100644 index 0000000..bb492de --- /dev/null +++ b/node_modules/node-addon-api/doc/class_property_descriptor.md @@ -0,0 +1,117 @@ +# Class property and descriptor + +Property descriptor for use with `Napi::ObjectWrap::DefineClass()`. +This is different from the standalone `Napi::PropertyDescriptor` because it is +specific to each `Napi::ObjectWrap` subclass. +This prevents using descriptors from a different class when defining a new class +(preventing the callbacks from having incorrect `this` pointers). + +## Example + +```cpp +#include + +class Example : public Napi::ObjectWrap { + public: + static Napi::Object Init(Napi::Env env, Napi::Object exports); + Example(const Napi::CallbackInfo &info); + + private: + static Napi::FunctionReference constructor; + double _value; + Napi::Value GetValue(const Napi::CallbackInfo &info); + void SetValue(const Napi::CallbackInfo &info, const Napi::Value &value); +}; + +Napi::Object Example::Init(Napi::Env env, Napi::Object exports) { + Napi::Function func = DefineClass(env, "Example", { + // Register a class instance accessor with getter and setter functions. + InstanceAccessor("value", &Example::GetValue, &Example::SetValue), + // We can also register a readonly accessor by passing nullptr as the setter. + InstanceAccessor("readOnlyProp", &Example::GetValue, nullptr) + }); + + constructor = Napi::Persistent(func); + constructor.SuppressDestruct(); + exports.Set("Example", func); + + return exports; +} + +Example::Example(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + // ... + Napi::Number value = info[0].As(); + this->_value = value.DoubleValue(); +} + +Napi::FunctionReference Example::constructor; + +Napi::Value Example::GetValue(const Napi::CallbackInfo &info) { + Napi::Env env = info.Env(); + return Napi::Number::New(env, this->_value); +} + +void Example::SetValue(const Napi::CallbackInfo &info, const Napi::Value &value) { + Napi::Env env = info.Env(); + // ... + Napi::Number arg = value.As(); + this->_value = arg.DoubleValue(); +} + +// Initialize native add-on +Napi::Object Init (Napi::Env env, Napi::Object exports) { + Example::Init(env, exports); + return exports; +} + +// 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.value); +// It prints 11 +example.value = 19; +console.log(example.value); +// It prints 19 +example.readOnlyProp = 500; +console.log(example.readOnlyProp); +// Unchanged. It prints 19 +``` + +## Methods + +### Constructor + +Creates new instance of `Napi::ClassPropertyDescriptor` descriptor object. + +```cpp +Napi::ClassPropertyDescriptor(napi_property_descriptor desc) : _desc(desc) {} +``` + +- `[in] desc`: The `napi_property_descriptor` + +Returns new instance of `Napi::ClassPropertyDescriptor` that is used as property descriptor +inside the `Napi::ObjectWrap` class. + +### Operator + +```cpp +operator napi_property_descriptor&() { return _desc; } +``` + +Returns the original N-API `napi_property_descriptor` wrapped inside the `Napi::ClassPropertyDescriptor` + +```cpp +operator const napi_property_descriptor&() const { return _desc; } +``` + +Returns the original N-API `napi_property_descriptor` wrapped inside the `Napi::ClassPropertyDescriptor` -- cgit v1.2.3