5

クラスはと をv8::FunctionCallbackInfo区別ThisHolderます。this私は JavaScript の内容を知っており、それThisがその設定を反映していると思います。しかし、私は何が何であるかについて漠然とした考えしか持っていませHolderん.HolderThis

特に、nan ベースの node.js 拡張機能を作成して をアンラップするObjectWrap場合、どれを渡す必要がありますか?

現在、node::ObjectWrapドキュメントには を使用Holderした例があり、現在のNan::ObjectWrapドキュメントでは が使用Thisされているため、「ドキュメントの例に従ってください」というだけでは、この質問への回答には役立ちません。

4

1 に答える 1

3

上記の質問を書いている間、私はさらに掘り下げて、最終的にv8-users Google Groupでいくつかの関連するスレッドを見つけました。私に最も関連があると思われる 2 つの投稿の短い部分を引用しますが、それらは文脈から切り離されているため、詳細については、含まれているスレッドを読む価値があるかもしれません。私が追加した書式設定マークアップ。

Christian 'Little Jim' Plesner は 2009 年に次のように書いています。

つまり、 a を介してSignature、関数 template のインスタンスでのみ関数を呼び出す必要があることを指定した場合T、 によって返される値は、から作成されたインスタンス、または から直接的または間接的に sする別の関数テンプレートHolderを保持することが保証されます。の型に関する保証はありません。TFunctionTemplate::InheritTThis

この声明は、2010 年に Stephan Bealによって参照されました。同じスレッドの後半で、Anton Muhin は次のように書いています。

全体的Holderには常に のプロトタイプ チェーンにある必要があるThisため、プロパティを読めば両方を自由に使用できます。ただし、次の場合、プロパティを設定すると動作が異なりますThis() != Holder() — プロパティが別のオブジェクトで終了する場合。

この側面は、2014 年に Ben Noordhuis によって再び繰り返されます。

Holder最初のステートメントは、それが正しいことを示唆しているようで、nan ドキュメントを変更する必要があります。後者は、内部状態と直接やり取りしない限りThis、一般に、より適切であることを思い出させてくれます。ObjectWrap

Thisどのように予期しないタイプになるかについての最初の引用された投稿に示されている例は次のとおりです。

var x = { }
x.__proto__ = document;
var div = x.createElement('div');

そのため、彼は「互換性の理由から、これを許可する必要がある」と書いています。nanベースの拡張タイプ(nanテストスイートから)で同じことを試してみると、最近、上記の結果がTypeError: Illegal invocation. そのため、署名検証のセマンティクスが多少変更されたようです。最近では、またはObjectWrap::Unwrapを使用するかどうかはあまり問題ではないようです。ただし、Node 0.10 では状況が異なるように見えるため、少なくともメソッドについては優先する必要があると思い、これについてnan プル リクエスト #524を提出しました。ThisHolderHolder

アクセサーの状況ははるかに複雑です。プロトタイプにインストールされたアクセサでは使用Holder()できないため、インスタンス テンプレートにアクセサをインストールするThisか、手動の型チェックを使用して実行する必要があるようです。

于 2015-12-13T23:01:55.283 に答える