3

我有一个骨干模型

var app = app || {};

app.Era = Backbone.Model.extend({

    defaults: {
        from: Number.NEGATIVE_INFINITY,
        until: Number.POSITIVE_INFINITY,
        stash: {
            from: null,
            until: null
        },
        _enabled: true
    },

    toggle: function(){
        if(this.get('_enabled')){
            this.disable();
        }else{
            this.enable();
        }

        this.save();
    },

    enable: function(){
        this.from = this.stash.from;
        this.until = this.stash.until;

        this.stash.from = null; // strictly speaking unnecssary
        this.stash.until = null;

        this._enabled = true;
    },

    disable: function(){
        this.stash.from = this.from;
        this.stash.until = this.until;

        this.from = null;
        this.until = null;

        this._enabled = false;
    },

    enabled: function(){
        return this._enabled;
    },

});

我试图像这样扩展

Name = app.Era.extend({ defaults: { value: '' } });

这似乎有效,我在控制台中没有错误。我什至可以实例化一个新名称,但是当我尝试实例化一个新名称时,我收到一条错误消息:

> era = new app.Era()
child
> era.get('from')
-Infinity
> Name = app.Era.extend({ defaults: { value: '' } })
function (){ return parent.apply(this, arguments); }
> name = new Name()
child
> name.get('value')
TypeError: Object [object Object] has no method 'get'

我将不胜感激一些反馈!

4

2 回答 2

10

编辑:这很可能是一个不错的答案,但不是针对这个特定问题...正确答案由 Bryan Clark 提供。无论如何,我都会把它留在这里,因为虽然我误解了你的问题,但它描述了一个常见问题的解决方案,无论如何可能会对你有所帮助。

骨干继承通过修改构造函数的原型来工作。当您扩展模型并重新定义defaults属性时,它不会将Name.defaults属性合并到Era.defaults,而只是将其隐藏。

考虑一个简化的例子:

var Era = Backbone.Model.extend({ name: "Era" });
var Name = Era.extend({ name: "Name" });
console.log(new Name().name); //-> "name", makes sense, right?

要将派生类合并defaults到超类,您可以利用Model.defaults可以定义为函数和对象字面量的事实。

var Era = Backbone.Model.extend({ 
  defaults: {
    //..
  } 
});

var Name = Era.extend({ 
  //define defaults as a function
  defaults: function() {
    //copy the superclass defaults into a new object, and
    //then extend that with the new defaults
    return _.extend({}, Era.prototype.defaults, {
      value:''
    });
  }
});
于 2013-01-30T22:15:23.850 回答
3

你不能name在那种情况下使用,你会遇到window.name. 如果您从头开始没有小写名称变量,您应该运行得很好。此外,fencliff 在如何使用默认继承方面提出了很好的观点。

于 2013-01-30T22:26:32.153 回答