【问题标题】:How to call the defaults method of parent model in backbone如何在主干中调用父模型的默认方法
【发布时间】:2014-07-23 05:23:39
【问题描述】:

我创建了一个 ParentModel 和几个扩展 ParentModel 的其他模型。每个 ChildModel 都有一些比 ParentModel 额外的属性。

我想调用 ParentModel 的默认方法并获取该 JSON 并添加一些额外的属性并从 ChildModel 的默认值返回修改后的对象。

这是我的代码:

var ParentModel = Backbone.Model.extend({
  defaults: function() {
    return {
      name: '',
      description: '',
      ruleType: '',
      creationDate: ''
    };
  }
});

var ChildModel = ParentModel.extend({
  defaults: function() {
    //Q: How to get the defaults from ParentModel and add one more property to json
  }
});

var c = new ChildModel({});

但我无法弄清楚如何调用它正在扩展的类的默认方法(ParentModel)

【问题讨论】:

    标签: javascript inheritance backbone.js superclass


    【解决方案1】:

    _.extend({extraProps:here}, ParentModel.prototype.defaults)

    【讨论】:

    • 感谢@Robert 的快速回答 (+1)。但是为什么我们必须在 defaults 方法中使用 ParentModel 这个词。不应该是这样的:this.parent.prototype.defaults 或 this.superClass.prototype.defaults 吗?
    • 另外,你的答案不应该是这个_.extend(ParentModel.prototype.defaults(), {extraProps:here})。两件事:调用默认方法,它应该是第一个参数。
    • JS 没有父类 sp 的概念,你必须这样做。扩展修改您在第一个参数中传递的对象,因此您不想在那里传递父级的默认值。您可以将 {} 作为第一个参数传递,然后是父类,然后是子类
    • 哦..我不知道。感谢您提供这些有用的信息。
    【解决方案2】:

    Backbone 允许您通过__super__ 属性访问父级的原型。

    所以你可以像这样调用父方法:

    this.constructor.__super__.parentMethod.apply( this, arguments )
    

    所以在你的情况下:

    var ChildModel = ParentModel.extend({
        defaults: function() {
            return _.extend( 
                { extraProps: 'here' }, 
                this.constructor.__super__.defaults.apply( this, arguments )
            );
        }
    });
    

    解释:

    • __super__ 是“静态”属性,而不是原型属性,因此必须通过 this.constructor.__super__ 而不是仅通过 this.__super__ 访问。
    • 我们在这里使用apply() 而不是直接调用defaults()。这允许我们做两件事。首先,它让我们设置this 在父defaults() 方法中的值。这在您的情况下并不重要,但可能是在其他父方法被覆盖时。然后我们使用apply() 的第二个参数传递任何传递给子函数的arguments。同样,这在您的情况下并不重要,但可能对其他人有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-08
      • 2011-10-01
      • 1970-01-01
      • 2023-03-09
      • 2012-07-10
      • 2018-08-28
      • 2020-11-21
      • 1970-01-01
      相关资源
      最近更新 更多