【问题标题】:new Backbone.Model() vs Backbone.Model.extend()新 Backbone.Model() 与 Backbone.Model.extend()
【发布时间】:2012-02-23 23:29:34
【问题描述】:

我是 JS 和 Backbone 的新手

这两者有什么区别?

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

【问题讨论】:

    标签: javascript backbone.js constructor instance


    【解决方案1】:

    有一个基本的区别,简单来说就是“房子的工程和房子本身的区别”。

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

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

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

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

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

    例子:

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

    一般情况

    当'backboneing'(使用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!"});
    

    ....希望这有帮助...

    【讨论】:

    • +1 用于比喻(房屋项目与房屋本身):)
    • 你能说用“extend”创建原型,用“new”从原型创建对象吗?!
    【解决方案2】:

    在第二种情况下,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" })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多