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

时间:2011-06-28 18:39:58

标签: javascript backbone.js prototypal-inheritance

我有静态属性,我想从我的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 

2 个答案:

答案 0 :(得分:4)

嗯。虽然上面的代码确实有效,但我不会这样做。如果函数可以通过类的对象在逻辑上访问,那么在基类中定义一个调用类/“静态”函数的实例方法。这使得代码更清晰,更清晰,我认为(另外,客户端不必记住有些神秘的语法):

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();

答案 1 :(得分:2)

在您的示例中,什么不能正常工作?在Firefox和IE中,我得到两个带有'bar'的弹出框,看起来像预期的结果?它的静态部分看起来也很好,请参阅this jsfiddle

(这是关于HEAD版本的Backbone,顺便说一下;不知道这是否有所作为)