我是Backbone.js的新手,在我最近的项目中,我需要一个模型的自定义验证机制。我认为有两种方法可以做到。
扩展Backbone.Model.prototype
_.extend(Backbone.Model.prototype,{ ... });
创建从Backbone模型继承的自定义模型
MyApp.Model = Backbone.Model.extend({...});
在这种情况下,我完全不确定哪一个是好方法。我知道覆盖原型对本机对象不利,但这也适用于骨干模型原型吗?如果我采用第一种方法,我将面临哪些问题?
答案 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源代码中。