覆盖骨干模型原型与扩展模型

时间:2013-12-09 09:14:02

标签: validation backbone.js prototype

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

  1. 扩展Backbone.Model.prototype

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

它已经实现了你的第一个方法+其他近乎技巧来实际设置一个正确的继承链(_.extend只做一个对象属性的副本,你可以查找Backbone的extend()和Underscore的代码的差异_ .extend,它们非常大而且不是很有趣。仅扩展.prototype对于'真正的'继承来说是不够的。)

当我第一次阅读您的问题时,我误解了并且认为您在询问是从您自己的模型类扩展还是直接从Backbone Extend扩展。这不是你的问题,所以我为第一个答案道歉,只是在这里保留一个摘要:你可以使用这两种方法。我看到或工作的大多数大型网站首先从Backbone.Model扩展到创建一个通用的MyApp.Model(这就是为什么我感到困惑,这通常是他们给它的名字:)),这意味着REPLACE Backbone.Model 。然后对于每个模型(例如User,Product,Comment,等等......),它们将从此MyApp.Model扩展而不是从Backbone.Model扩展。通过这种方式,他们可以修改一些全局Backbone行为(适用于所有模型),而无需更改Backbone的代码。

答案 1 :(得分:1)

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

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

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

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

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

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

function MyClass(args) {
  //Do stuff
}

MyClass.prototype = {....}

它甚至用在Firefox源代码中。