私は一種の javascript テキストベースのゲーム エンジンに取り組んでいます。「onuse」メソッドを持つ JavaScript オブジェクトがあります。これは、次のように使用すると素晴らしく機能します。
var button = new CanvasObject();
button.text = "test" // Necessary for the next code sample
button.onuse = function(){ button.x += 1 }; // Some simple reaction;
CanvasObject を描画するときに、次のように span タグでラップする Canvas オブジェクトのコードがあります。
<span onclick = "function{ button.x += 1 }">test</span>
// Or to make the HTML cleaner:
<span onclick = canvas.callFunction(5)>test</span>
// where canvas.callFunction will call the function needed.
// Canvas keeps an array of functions that can be called.
Canvas は関数を呼び出します。この関数は「絶対」項を使用しているため、「button.x += 1」という行は正常に機能します。問題は、CanvasObject から拡張した別のクラス (ButtonObject など) があることです。クラス定義に、既に定義されている onuse 関数が必要です。例(ここに並べられた継承手法を使用)
ButtonObject.method('onuse', function(){
this.x++; // Some function requiring 'this'.
});
最初の手法を使用して HTML から関数を呼び出すと、エンジンはそれを無名関数として呼び出すだけでした。次に、「this」がウィンドウとして定義されます。ButtonObject のすべてのインスタンスに同じ「onuse」関数を持たせたいので、CanvasObject で行ったように毎回定義するのは、多くの余分なコードのように思えます。私が考えた解決策の 1 つは、エンジンの動作方法を変更して、各オブジェクトに「名前」プロパティが与えられるようにすることでした。これは、JavaScript 名と同等です。このようにして、エンジンは次のように文字列を簡単に書き込むことができます。
innerHTML += ( "<span onclick=' + buttonObjectInstance.name + ".onuse()'>" );
しかし、この手法では、オブジェクトをインスタンス化するたびに、次のようにオブジェクトの名前を 2 回指定する必要があります。
var startButton = ButtonObject('startButton');
これは本当に私の唯一の選択肢ですか?または、そのオブジェクトの名前がなくても、オブジェクトのコンテキストで関数を呼び出す方法はありますか?