Backbone bizzare语法

时间:2014-08-26 14:28:48

标签: javascript jquery backbone.js frontend

我真的很难理解Backbone的语法但是失败了,请看下面的代码:

var MenuItemDetails = Backbone.Model.extend({});

我查看了Backbone.js的源代码,发现了Backbone.Model的以下声明

var Model = Backbone.Model = function(attributes, options) {
  var attrs = attributes || {};
  options || (options = {});
  this.cid = _.uniqueId('c');
  this.attributes = {};
  if (options.collection) this.collection = options.collection;
  if (options.parse) attrs = this.parse(attrs, options) || {};
  attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
  this.set(attrs, options);
  this.changed = {};
  this.initialize.apply(this, arguments);
};

据我所知var Model现在是一个函数,它将作为构造函数。我不明白的是:

  1. 我们没有致电var myModelObject = new Model()var myModelObject = new Backbone.Model()。相反,我们正在呼叫Backbone.Model.extend()。这究竟如何作为构造函数?
  2. 此致电Backbone.Model.extend()打破了我的想法。我们在另一个名为extend
  3. 的函数上调用了一个名为Backbone.Model的函数

1 个答案:

答案 0 :(得分:2)

我认为你在两个不同的目标之间感到困惑:

var myModelObject = new Backbone.Model()var myModelObject = new MyCutomModel()用于创建模型的新实例。

Backbone.Model.extend()用于创建自己的自定义模块,因此您的代码看起来像这样:

var MyCutomModel = Backbone.Model.extend({
    initialize: function () {
        // Overwrite the default initialize function
    }, 
    customMethod: function () {
        // Write your own custom method that you can use in this model
    }
});

extend方法不是JavaScript的一部分。没有Javascript原生的默认extend方法。

然而,许多图书馆都有自己的extend方法,图书馆和个人编写自己的extend方法非常常见(他们的做法可能会有很大不同,{{ 1}},$.extend_.extend都不同;虽然Backbone.Model.extend$.extend非常相似)。

Backbone有自己的自定义_.extend方法(Read the Source Code),它基本上为对象及其原型添加了属性和方法。

创建extend的实例后,您可以使用您在MyCutomModel中为其定义的方法。

extend

回答问题的第二部分:是的,这有点令人困惑。这是JavaScript!

var my_custom_model = new MyCutomModel(); my_custom_model.customMethod(); 是一个函数,但该函数的作用是返回一个对象。该函数还可以具有可以在该函数上调用的方法。请查看以下代码stackoveflow question

Backbone.Model

由于JavaScript函数实际上是Function object,因此在JavaScript中,函数返回某些内容并且还有一个方法是完全可以的。