【问题标题】:Overriding backbone model prototype vs extending model覆盖主干模型原型与扩展模型
【发布时间】:2013-12-09 09:14:01
【问题描述】:

我是 Backbone.js 的新手,在我最近的项目中,我需要一个自定义的模型验证机制。我看到了两种方法可以做到这一点。

  1. 扩展 Backbone.Model.prototype

    _.extend(Backbone.Model.prototype, { ... });

  2. 创建继承自 Backbone 模型的自定义模型

    MyApp.Model = Backbone.Model.extend({ ... });

我很不确定在这种情况下哪一个是好方法。我知道覆盖原型对本机对象不利,但这也适用于骨干模型原型吗?如果我采用第一种方法,我会面临什么样的问题?

【问题讨论】:

    标签: validation backbone.js prototype


    【解决方案1】:

    您应该使用第二种方法,这就是 Backbone.Model.extend({}) 的重点。

    它已经完成了您的第一种方法 + 其他实用技巧来实际设置正确的继承链(_.extend 只是复制对象属性,您可以查看 Backbone 的 extend() 和 Underscore 的 _ 的代码差异.extend,它们非常大而且不是很有趣。仅仅扩展 .prototype 不足以实现“真正的”继承)。

    当我第一次阅读您的问题时,我误解并认为您是在问是从您自己的模型类扩展还是直接从 Backbone Extend 扩展。这不是你的问题,所以我为第一个答案道歉,只是在这里做一个总结:你可以使用这两种方法。我看到或工作过的大多数大型网站首先从 Backbone.Model 扩展以创建一个通用的 MyApp.Model (这就是我感到困惑的原因,这通常是他们给它的名字:)),这意味着替换 Backbone.Model .然后对于每个模型(例如用户、产品、评论等),它们将从这个 MyApp.Model 扩展,而不是从 Backbone.Model 扩展。这样,他们可以修改一些全局 Backbone 行为(针对他们所有的模型),而无需更改 Backbone 的代码。

    【讨论】:

    • 如果我使用第一种方法我会面临什么痛苦?
    • 谢谢,我仍然没有得到这个问题的答案“如果我采用第一种方法,我会面临什么样的问题?”
    • 这是一个复杂的问题,您是否按照我的建议查看了代码?例如,您将在代码中看到,使用 Backbone.Model.extend() 将为您提供一个 super 属性来访问父级的原型。但最重要的关键特性是它为您提供了开箱即用的代理继承。因此,采用第一种方法,您将面临代理继承试图解决的所有问题,例如,在不需要时不调用父级的构造函数...
    • 我不接受这个作为让更多人参与讨论并获得赏金的答案。
    • 好的...也许可以了解一下您需要什么样的信息? _.extend 执行“将源对象中的所有属性复制到目标对象”(来自文档)和 .extend() 执行“[...] 为子类设置原型链。类似于 goog .inherits,但使用要扩展的原型属性和类属性的散列。”。所以对我来说,很明显为什么你应该做 .extend() 而不是 _.extend()!一个用于基本对象,一个专门用于继承。
    【解决方案2】:

    _.extend(Backbone.Model.prototype, {...mystuff...}) 会将您的属性添加到每个 Backbone.Model,以及基于它的对象。您可能打算做相反的事情,_.extend({...mystuff...}, Backbone.Model) 这不会改变 Backbone 本身。

    如果您查看 annotated Backbone source,您会看到类似

    的行
    _.extend(Collection.prototype, Events, { ... Collection functions ...} )
    

    这会将 Events 对象内容与其他一些集合函数一起添加到每个集合中。同样,每个模型都有事件:

     _.extend(Model.prototype, Events, { ... Model functions ...})
    

    这似乎是在 Javascript 中创建“类”的常见模式:

    function MyClass(args) {
      //Do stuff
    }
    
    MyClass.prototype = {....}
    

    它甚至被用在 Firefox 源代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多