2017-09-25 4 views
0

状況は次のとおりです。オブジェクト+プロトタイプで定義したすべての関数に対して単一のduktape/C関数を使用したいと思います。そのためには、関数名とコールバック(実際にはstd::function)を取り、簡単に一般的な処理を行い、コールバックを簡単にすることができる関数マップを用意しています(インプレースラムダを使用することもできます)。duktape用の中央機能ディスパッチャーを書くには?

これは既にうまく機能しています。一つの問題:異なるオブジェクト上に同じ名前の関数があります。曖昧さを解消するために、オブジェクトのヒープポインタ(またはオブジェクトでもあるプロトタイプ)をさらに修飾子として使用します。したがって、私の中心的なduktape/C関数が呼び出されるとき、関数がグローバルかどうかを最初に調べます(つまり、グローバルオブジェクトで定義されています)。それが失敗した場合、私はthisバインディングを取得し、そのヒープポインタで検索します。それも失敗した場合は、プロトタイプチェーンを歩き、プロトタイプの1つで関数を見つけることができるかどうかを確認します。

これはthisバインディング(または間違ったもの、Function.prototype.apply()のようなもの)がない場合を除いて、99%までうまく機能します。

質問:私の中心的なduktape/Cコールバックの関数の元のプロトタイプはどうすれば入手できますか?

答えて

0

答えは私が最初に考えたよりも簡単です。その中央関数マップの場合は、関数名を持つ必要があります。これは、オブジェクトまたはプロトタイプに新しい関数を定義するときに作成する関数オブジェクトのプロパティとして設定する必要があります。

元のオブジェクト/プロトタイプに対しても同じアプローチを使用できます。他のプロパティ(例: "ptr")として関数オブジェクトに逆参照を追加するだけです。これにより、関数の名前だけでなく、実行のコンテキストも簡単に取得できます。私たちはすでに正しいオブジェクト/プロトタイプを持っているので、継承チェーンの散歩は必要ありません。

関連する問題