如何在不指定模型名称的情况下从该模型的实例调用静态Backbone.Model函数?

aw *_*rud 8 javascript prototypal-inheritance backbone.js

我有静态属性,我想从我的Backbone.Model对象的实例访问.我知道我可以硬编码父构造函数来调用方法,但是这会阻止我使用多态静态函数.例如,我希望能够fooExtendedInventory必要时覆盖该函数,而无需更改任何其他代码.

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 
Run Code Online (Sandbox Code Playgroud)

Ed *_*der 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();
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 2

在你的例子中,什么不起作用?在 Firefox 和 IE 中,我都会看到两个带有“bar”的弹出窗口,这看起来像预期的结果吗?它的静态部分似乎也表现良好,请参阅此 jsfiddle

(这是 Backbone 的 HEAD 版本,顺便说一句;不知道这是否有区别)