这与ObjectWrap :: Unwrap的持有人

MvG*_*MvG 5 c++ v8 node.js node.js-nan node.js-addon

v8::FunctionCallbackInfo级区分ThisHolder。我知道thisJavaScript中的内容,并假设这This反映了该设置。但是我对什么Holder是一个模糊的概念,对于何时应该使用Holder而不是却一无所知This

特别是,在编写基于nan的node.js扩展并解包时ObjectWrap,我应该通过哪些?

当前node::ObjectWrap文档中有使用示例,Holder当前Nan::ObjectWrap文档中使用This,因此“仅遵循文档中的示例”无助于回答这个问题。

MvG*_*MvG 3

在写上面的问题时,我做了一些更多的挖掘,最终在v8-users Google Group上找到了一些相关的线程。我将引用两篇文章中似乎与我最相关的一小部分,但它们是断章取义的,因此包含的线程很可能值得阅读以获取更多信息。格式化我添加的标记。

\n\n

克里斯蒂安·“小吉姆”·普莱斯纳 (Christian Plesner) 在 2009 年写道:

\n\n
\n

简而言之:如果您通过 a 指定Signature函数只能在函数模板的实例上调用T,则返回的值Holder保证保存从T直接或间接创建的实例或另一个函数模板创建的实例ns FunctionTemplate::Inherit来自T. 对于 的类型没有任何保证This

\n
\n\n

Stephan Beal 在 2010 年引用了该声明。后来在同一条线索中,安东·穆欣 (Anton Muhin) 写道:

\n\n
\n

总体Holder应该始终位于Thisand 的原型链中,因此如果您阅读了该属性,则可以自由地使用两者。但是,如果属性以This() != Holder()不同的对象结尾,则设置属性的行为会有所不同。

\n
\n\n

Ben Noordhuis 在 2014 年再次重复了这一点。

\n\n

第一个声明似乎表明这Holder是正确的,并且应该更改 nan 文档。后者提醒我们,一般来说,除非一个人像这样做一样直接与某种内部状态交互,This否则更合适。ObjectWrap

\n\n

第一篇引用的文章中给出的关于如何This成为意外类型的示例如下:

\n\n
var x = { }\nx.__proto__ = document;\nvar div = x.createElement(\'div\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

为此,他写了\xe2\x80\x9c,出于兼容性原因,我们必须允许\n这个\xe2\x80\x9d。尝试使用基于 nan 的扩展类型(来自 nan 测试套件)进行相同的操作,我发现这些天上面的结果似乎是一个TypeError: Illegal invocation. 显然签名验证语义已经发生了一些变化。ObjectWrap::Unwrap如今,无论您使用This或 ,似乎都不那么重要了Holder。不过,Node 0.10 的情况看起来有所不同,所以我认为Holder至少对于方法来说应该是首选,并就此提交了nan pull request #524 。

\n\n

访问器的情况要复杂得多。使用Holder()对于安装在原型上的访问器不起作用,因此显然必须在实例模板上安装访问器,或者使用This并执行一些手动类型检查。

\n