新的Backbone.Model()vs Backbone.Model.extend()

时间:2012-02-01 09:07:02

标签: javascript backbone.js constructor instance

我是JS和Backbone的新手

这两者之间有什么区别?

TestModel = new Backbone.Model({ title: "test title" })
TestModel = Backbone.Model.extend({ title: "test title" })

2 个答案:

答案 0 :(得分:77)

有一个基本的区别,简而言之,可以被描述为“房屋项目与房屋本身之间的差异”。

对于专家程序员,我只想说“new Backbone.Model”返回一个对象实例,但“Backbone.Model.extend”返回一个构造函数

第一个:新对象 (即房子)

var TestModel = new Backbone.Model({ title: "test title" });

创建一个新的Object,其结构(方法和变量)已在其他地方定义。对象可以被视为语言的“所有非本地项”,对于“本机项”,我指的是基本类型,如整数,字符等。

在大括号{}中,您传递了某个变量或方法的值。正如Tomasz Nurkiewicz先前所解释的那样,这被称为构造函数,因为它允许您“构造”一个​​新对象,其模型已在别处描述过。

给你一个已知的例子:你写

var myArray = new Array();

这意味着您正在创建一个新的Array,这是一个在其他地方定义的非本机对象。你也可以写:

var myArray = new Array([1,2,3,4,5]);

它用给定的数字填充数组。

SECOND:修改现有对象的定义 (即房子的项目)

var TestModel = Backbone.Model.extend({ title: "test title" })

你对你的VM说了一些非常简单的话:“你给我的默认对象非常好,但我想实现更多的功能/属性”。 因此,使用“extend”子句,您可以修改对象的定义,添加或覆盖现有的方法/属性。

示例:backbone.js中的一个很好的例子是由集合的比较器函数给出的。当您扩展定义它的对象时,“它将用于按排序顺序维护集合”。

示例:

myCollection = Backbone.Collection.extend({
    comparator:function(){
        return item.get('name');
    }
});

一般

当'backboning'(使用backbone.js框架开发)时,您应该做的是扩展给定对象(例如View):

window.ButtonView = Backbone.View.extend({
    btnText:'nothingByDefault',
    myNewMethod:function(){
       //do whatever you want, maybe do something triggered by an event, for instance
    }
});

然后在代码中的其他地方使用它,对于你想要处理的每个按钮一次,包括在括号中你想要给对象的所有值

[...]
var submitBtn = new ButtonView({btnText:"SubmitMe!"}),
var cancelBtn = new ButtonView({btnText:"Erase All!"});

....希望这会有所帮助...

答案 1 :(得分:14)

在第二种情况下,TestModel是一个构造函数,您可以在以后多次使用它来创建模型实例:

var model = new TestModel();

但是,将title传递给extend具有不同的含义。您应该使用:

var TestModel = Backbone.Model.extend({defaults: { title: "test title" }});

或在创建对象时传递模型属性:

var model = new TestModel({ title: "test title" });

另一方面,在第一种情况下TestModel已经是模型的实例(因此它应该被命名为testModel以遵循JavaScript命名约定):

var testModel = new Backbone.Model({ title: "test title" })