Javascript 如何覆盖默认主干模型?

Javascript 如何覆盖默认主干模型?,javascript,backbone.js,underscore.js,requirejs,Javascript,Backbone.js,Underscore.js,Requirejs,我想覆盖默认主干模型变量(Backbone.Model)以使用我自己的自定义验证方法(isValid,validate)并添加一些属性 _.extend(Backbone.Model, { isValid: function() { // custom function }, validate: function() { // custom logic } }); var myModel = Backbone.Model.extend({ // this adds for

我想覆盖默认主干模型变量(Backbone.Model)以使用我自己的自定义验证方法(isValid,validate)并添加一些属性

_.extend(Backbone.Model, {
    isValid: function() { // custom function },
    validate: function() { // custom logic }
});

var myModel = Backbone.Model.extend({
   // this adds for example properties to my modified Backbone model.
});

不幸的是,这不起作用。。。当我用requirejs加载“wrapper,extensing”模块并创建一个新的模型实例,然后调用validate。它说它不知道任何验证函数…

您必须扩展
主干.Model.prototype
而不是
主干.Model
本身,因为所有方法都是构造函数的原型方法,而不是模型上的属性。尽管最好创建一个自定义的BaseModel来扩展主干。建模并实现您的自定义逻辑,以便在主干得到更新等情况下,您可以避免可能的冲突,即使在这种情况下,这些冲突不大可能发生。扩展基干类而不是修改基干类仍然被认为是一种更好的做法它们。

您必须扩展
主干.Model.prototype
而不是
主干.Model
本身,因为所有方法都是构造函数的原型方法,而不是模型上的属性。尽管最好创建一个自定义的BaseModel来扩展主干。建模并实现您的自定义逻辑,以便在主干得到更新等情况下,您可以避免可能的冲突,即使在这种情况下,这些冲突不大可能发生。扩展基干类而不是修改基干类仍然被认为是一种更好的做法它们。

我更喜欢为项目创建自定义模型,而不是“覆盖”不是面向对象的。(最后可能是相同的,但如果我们尝试模拟OOP,我觉得这更容易理解)

检查我的例子,我定义了你的AbstractModel,它是主干.Model的一种扩展,然后我所有的模型都扩展了这个抽象模型而不是主干模型

var YourProject = {};
YourProject.YourAbstractModel = Backbone.Model.extend({
    customProperty1 : null, 
    customProperty2 : null, 
    isValid : function(){ },    
    specificUtility : function(){ } 
});

var YourModel1 = YourProject.YourAbstractModel.extend({
    customProperty1 : 'aaaaa'
});
var YourModel2 = YourProject.YourAbstractModel.extend({
    customProperty1 : 'bbbbb'
});

console.log( new YourModel1().customProperty1 );
console.log( new YourModel2().customProperty1 );

我的方法也很灵活,可以有多个抽象模型,与主干的更新不冲突,而且我觉得更接近于可继承的过程。

我更喜欢为项目定制模型,而不是“覆盖”,这不是OOP。(最后可能是相同的,但如果我们尝试模拟OOP,我觉得这更容易理解)

检查我的例子,我定义了你的AbstractModel,它是主干.Model的一种扩展,然后我所有的模型都扩展了这个抽象模型而不是主干模型

var YourProject = {};
YourProject.YourAbstractModel = Backbone.Model.extend({
    customProperty1 : null, 
    customProperty2 : null, 
    isValid : function(){ },    
    specificUtility : function(){ } 
});

var YourModel1 = YourProject.YourAbstractModel.extend({
    customProperty1 : 'aaaaa'
});
var YourModel2 = YourProject.YourAbstractModel.extend({
    customProperty1 : 'bbbbb'
});

console.log( new YourModel1().customProperty1 );
console.log( new YourModel2().customProperty1 );

我的方法也很灵活,可以有多个抽象模型,与主干的更新不冲突,而且我觉得更接近于可继承的过程。

您可以使用Dersen提供的主干验证插件


它非常有用,而且易于使用。您还可以将视图绑定到模型,以便视图具有验证失败的特定模型属性的自定义错误属性。

您可以使用Dersen提供的主干验证插件


它非常有用,而且易于使用。您还可以将视图绑定到模型,以便视图具有特定模型属性的自定义错误属性,该属性未通过验证。

我也考虑过这个想法。这将是Backbone.marionete所采用的类似方法。但是,我更愿意继续使用Backbone.Model。你能给我一个关于原型扩展的代码片段吗?这里有一些很好的例子,如何扩展核心主干功能,希望你现在已经了解了,但以防万一,请用
.extend(backbone.Model,{
替换
.extend(backbone.Model.prototype,{
voila!我也考虑过这个想法。这将是Backbone.marionete所采用的类似方法。但是我更愿意继续使用Backbone.Model。你能给我一个关于原型扩展的代码片段吗?这里有一些很好的例子如何扩展核心主干功能希望你现在已经了解了,但以防万一只需将
.extend(Backbone.Model,{
替换为
.extend(Backbone.Model.prototype,{
瞧!