骨干模型创建|概念性理解

时间:2012-09-27 21:06:08

标签: javascript backbone.js

任何人都可以解释如何在Backbone中创建模型吗?传入一个对象,但是你可以使用new作为一个函数对象。

这让我相信Backbone以某种方式将对象文字附加到函数对象,因为你无法做到new {key1:value1, key2,value2}

来自Backbone的示例

var Sidebar = Backbone.Model.extend({
  promptColor: function() {
    var cssColor = prompt("Please enter a CSS color:");
    this.set({color: cssColor});
  }
});

window.sidebar = new Sidebar;

sidebar.on('change:color', function(model, color) {
  $('#sidebar').css({background: color});
});

sidebar.set({color: 'white'});

sidebar.promptColor();

1 个答案:

答案 0 :(得分:3)

这与JavaScript中的对象系统如何工作以及对象和constructornew keyword概念有关。

如果您定义具有某些属性的对象:

var myobj = {
    foo: 'bar'
}

然后尝试执行new myobj您将收到myobj不是函数的错误。

但是,假设我们定义了一个函数,它将一些值传递给this属性:

var myobj = function(foo){
    this.foo = foo || "bar";
}

让我们尝试制作一个new实例:

var m = new myobj()
m.foo
> bar
var m2 = new myobj('baz');
m2.foo
> baz

这是有效的,因为JavaScripts中的函数只是函数类型的对象:

typeof myobj
> "function"
typeof myobj.prototype
> "object"

现在,如果你看一下Backbone source(特别是第184行),你会看到:

 var Model = Backbone.Model = function(attributes, options) {

该行表示模型实际上是一个可以接受两个参数attributesoptions的函数。

这是允许您创建此new副本的原因。