2012-02-01 24 views

回答

74

有一个基本的差异,这在短可以被描述为“差在房子的项目和房子之间“。

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

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

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

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

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

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

var myArray = new Array(); 

这意味着,要创建一个新的Array,这是已被别处定义的非原生对象。你也可以这样写:

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

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

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

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

你说你的虚拟机的东西很简单:“的对象你给我默认是非常好的,但我想实现更多的功能/性能” 。 因此,通过“扩展”子句,您可以修改对象的定义,添加或覆盖现有的方法/属性。

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

例子:

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

通则

你需要“backboning”(使用Backbone.js的框架开发)是延长定对象(例如视图时做什么)有:

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

....希望这有助于价值...

+12

+1(房子VS房子本身的项目)的隐喻:) – 2013-07-23 14:08:51

+3

能你说用“扩展”你创建一个原型,用“新”从原型创建一个对象?! – netfed 2014-10-20 01:58:39

14

在第二种情况下TestModel是一个构造器,您可以使用几次后创建模型的实例:

var model = new TestModel(); 

但是经过titleextend具有不同的含义。你或许应该使用:

​​

或通过创建一个对象的时候,模型属性:

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

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

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