8

Backbone.Model オブジェクトのインスタンスからアクセスしたい静的プロパティがあります。親コンストラクターをハードコーディングしてメソッドを呼び出すことができることはわかっていますが、これにより、多態的な静的関数を使用できなくなります。たとえば、他のコードを変更することなく、必要に応じてfoo関数をオーバーライドできるようにしたいと考えています。ExtendedInventory

var Inventory = Backbone.Model.extend({},
    //STATIC
    {
        foo: function() {
            alert('bar');
        }
    });

var i = new Inventory({});
i.constructor.foo(); //This works!

var ExtendedInventory = Inventory.extend({});

var ei = new ExtendedInventory({});
ei.constructor.foo(); //THIS DOES NOT WORK


//How do I generically access the `Inventory.foo()` function via the `ei` object. I would 
4

2 に答える 2

5

うーん。上記のコードは機能しますが、そのままにしておくつもりはありません。クラスのオブジェクトを介して関数に論理的にアクセスできる場合は、クラス/「静的」関数を呼び出す基本クラスでインスタンス メソッドを定義します。これにより、コードがよりクリーンで明確になると思います (さらに、クライアントはやや難解な構文を覚える必要はありません)。

var Inventory = Backbone.Model.extend({
    foo: function() {
        this.constructor.foo();
    }
}, {
    foo: function() {
        alert('bar');
    }
});

var i = new Inventory({});
i.foo(); //This works!

var ExtendedInventory = Inventory.extend({});

var ei = new ExtendedInventory({});
ei.foo();
于 2011-06-30T16:32:00.437 に答える
2

あなたの例では、正確に機能しないものは何ですか? Firefox と IE の両方で、「バー」を含む 2 つのポップアップが表示されますが、これは意図した結果のように見えますか? その静的部分も同様に正常に動作しているように見えます。この jsfiddleを参照してください。

(これは Backbone の HEAD バージョンです。違いがあるかどうかはわかりません)

于 2011-06-28T21:28:37.443 に答える