From 35dc8bab9ef1b8e01b91854ebc05fbda8c0ba06b Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Thu, 2 Nov 2017 18:14:24 -0400 Subject: [PATCH] doc: document common pattern for instanceof checks Backport-PR-URL: https://github.com/nodejs/node/pull/19447 PR-URL: https://github.com/nodejs/node/pull/16699 Fixes: https://github.com/nodejs/node/issues/13824 Reviewed-By: James M Snell Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- doc/api/n-api.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 4a391a6feb05ef..70960fcf6f5495 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -3022,6 +3022,29 @@ constructor and methods can be called from JavaScript. callback, [`napi_unwrap`][] obtains the C++ instance that is the target of the call. +For wrapped objects it may be difficult to distinguish between a function +called on a class prototype and a function called on an instance of a class. +A common pattern used to address this problem is to save a persistent +reference to the class constructor for later `instanceof` checks. + +As an example: + +```C +napi_value MyClass_constructor = nullptr; +status = napi_get_reference_value(env, MyClass::es_constructor, &MyClass_constructor); +assert(napi_ok == status); +bool is_instance = false; +status = napi_instanceof(env, es_this, MyClass_constructor, &is_instance); +assert(napi_ok == status); +if (is_instance) { + // napi_unwrap() ... +} else { + // otherwise... +} +``` + +The reference must be freed once it is no longer needed. + ### *napi_define_class*