新的Backbone.Model()与Backbone.Model.extend()有什么区别?

60

我刚开始学习JS和Backbone

这两者有什么区别?

TestModel = new Backbone.Model({ title: "test title" })
TestModel = Backbone.Model.extend({ title: "test title" })
2个回答

78

基本的区别可以简短地描述为“房子项目和房子本身之间的区别”。

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

首先:一个新对象(即房屋)

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

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

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

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

var myArray = new Array();

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

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

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

第二步:修改现有对象的定义 (即房屋项目)

使用

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

你向虚拟机发送一条非常简单的消息:“你作为默认值提供给我的对象很好,但我想要实现更多的功能/属性”。 使用“extend”子句,您可以修改对象的定义,添加或覆盖现有方法/属性。

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

示例:

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

总体而言

在使用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!"});

希望这可以帮到你...


13
赞同这个比喻(房屋项目与房屋本身):) - Paolo Stefan
3
你可以说使用“extend”创建一个原型,而使用“new”从这个原型创建一个对象。 - netfed

13
在第二种情况下,TestModel 是一个构造函数,您可以稍后使用它多次创建模型实例:
var model = new TestModel();

然而,将 title 传递给 extend 具有不同的含义。你应该使用:

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

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

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

在另一方面的第一个案例中,TestModel已经是模型的实例(因此应该按照JavaScript命名约定将其命名为testModel):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接