0

私は一種の 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');

これは本当に私の唯一の選択肢ですか?または、そのオブジェクトの名前がなくても、オブジェクトのコンテキストで関数を呼び出す方法はありますか?

4

1 に答える 1