上記の質問を書いている間、私はさらに掘り下げて、最終的に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か、手動の型チェックを使用して実行する必要があるようです。