2

プレーンなJavascript(Coffescriptなし)のSpine.jsを使用しています。ドキュメント
で説明されている構文を使用して、親クラスのメソッドを呼び出しています。

具体的には:this.constructor .__ super __。someFunction.apply(this、arguments) 

これは、直接の子クラスが直接の親クラスと呼ばれる場合に正常に機能します。しかし、孫クラスを追加すると、すべての地獄が解き放たれます。孫クラスのインスタンスでメソッドを呼び出すと、無限ループが発生します。ここに示すクラス階層を実装することでこれを示すjsFiddleがあります。

MyObjClass(メソッドsayHi()を実装)
^
|
My2ndObjClass(メソッドsayHi()はスーパークラスを呼び出します)
^
|
My3rdObjClass

My3rdObjClassのインスタンスでsayHi()が呼び出されると、無限ループが発生します(Chromeコンソールは最大スタックエラーを報告します)。

私の推測では、sayHi()がMy3rdObjで実行されると、親クラスの実装が自然に実行されます(つまり、My2ndObjClassのsayHi()が実行されます)。My2ndObjClassのsayHi()は、superをMyObjClassではなくMy2ndObjClassに解決するため(予想どおり)、superの呼び出しは再帰呼び出しになり、離れて行くと... StackOverflow;)

それで、私は何か間違ったことをしていますか、それともこれはSpineの制限ですか?これを回避するための賢い方法があると思いますが、GoogleやRTFMでは見つかりませんでした。

4

1 に答える 1

0

2つのこと:「これ」はあなたが思っているものではありません。「this」のスコープは従来の言語構成に従わないため、必要なクロージャーで特定の変数を参照する必要があります。この場合は「my2ndObjClass」です。

次に、「include」を使用しているため、メソッドはクラスではなくインスタンスで定義されます。プロトタイプ/オブジェクトのcoffeescript/javascriptの使用では、探しているものがコンストラクター、オブジェクト自体にあるかどうかです。したがって、コンストラクターのsuperを調べないでください。オブジェクトを直接調べてください。

だから、あなたの定義

  my2ndObjClass.include({
    sayHi: function() {
        this.constructor.__super__.sayHi.apply(this,arguments);
    }
  });

になる

my2ndObjClass.include({
    sayHi: function() {
        my2ndObjClass.__super__.sayHi.apply(this,arguments);
    }
  });

そして、それは機能します。

IMHO、これらはすべて、この脆弱性と慣習をすべて回避するために、coffeescript を使用するすべての理由です。

于 2012-06-13T13:29:53.030 に答える