1

我想构建一个像对象/类这样的 Backbone.Model。

我查看了 Backbone 文档,发现他们创建了一个具有可继承属性的可继承对象/类,方法分两步:

一、创建一个带有一些属性的函数

var Model = Backbone.Model = function(attributes, options) {
    var defaults;
    attributes || (attributes = {}); //?
    if (options && options.parse) attributes = this.parse(attributes); //?
    if (defaults = getValue(this, 'defaults')) {
      attributes = _.extend({}, defaults, attributes); // ?
    }
    if (options && options.collection) this.collection = options.collection;
    this.attributes = {};
    this._escapedAttributes = {};
    this.cid = _.uniqueId('c');
    this.changed = {};
    this._silent = {};
    this._pending = {};
    this.set(attributes, {silent: true});

    this.changed = {};
    this._silent = {};
    this._pending = {};
    this._previousAttributes = _.clone(this.attributes);
    this.initialize.apply(this, arguments);
};

二、使用下划线的扩展来赋予它一些功能

_.extend(Model.prototype, Events, { // Events?
   changed: null,

   _silent: null,

   _pending: null,

   idAttribute: 'id',

   initialize: function(){},

   toJSON: function(options) {
       return _.clone(this.attributes);
   }

   // other Model methods...
};

我对这种行为有一些疑问:

  1. 第一部分的第 3-4 行是做什么的
  2. 第 6 行会发生什么?
  3. 为什么我们要放弃“_.extend”Events 对象,我还能提供什么作为参数?

还有什么我需要注意的吗?

问候

4

2 回答 2

3

第 3 行attributes || (attributes = {});短路评估的示例。如果属性的值是假的,那么 javascript 将评估 OR 表达式的第二部分。该部分分配一个空对象attributes的值。{}最终结果是,如果属性为空或未定义(典型情况),则为属性分配一个空对象。

那行相当于说:

if (attributes == false) { // attributes can be any value that evaluates to false
                           // attributes could be null, undefined, false, 0 etc
   attributes = {};
}

与第 4 行相同的情况,if (options && options.parse) attributes = this.parse(attributes);

如果一个options对象存在,即它不为空或未定义,并且该options对象有一个名为 的有效属性parse,则为属性分配this.parse(attributes);

编辑1:

Underscore.js 文档_.extend可以解释这些行。

它是创建一个新对象的标准模式,该对象将包含所有传入对象的属性。在第一个示例attributes = _.extend({}, defaults, attributes); // ?中,该模式用于用可能已传递的内容覆盖默认值。您会在大多数允许您传入选项对象的插件中看到这种模式。如果您不传递任何内容,则将使用默认值。如果您只传入几个属性,其余的将从默认值中获取它们的值。

http://api.jquery.com/jQuery.extend/不是完全相同的东西。但它非常相似。他们的文档要好得多。你会更好地理解这个概念。

编辑2:

Backbone Events类有一些与事件处理相关的方法。Backbone Model 类还需要能够使用事件处理。它需要引发事件来告诉视图重新渲染自己,当视图更改底层数据时,它需要监听来自 dom 的事件。此事件处理功能可以在定义 Model 类时从头开始重写,或者可以扩展 Model 类以从 Events 类中获取这些方法。后者就是正在发生的事情。

如果您阅读 $.extend 或 _.extend 的文档,您会意识到 Model 类不仅使用 Events 下的属性进行扩展,而且还使用其他属性(如 toJSON 和 initialize 等)进行扩展...

于 2012-07-13T09:01:24.307 回答
1

至于第 6 行发生了什么 - 创建的对象包含对象的所有属性以及defaults对象的所有属性attributesdefaults已在对象中定义的对象的任何属性都attributes将被后者的值覆盖。

于 2012-07-13T09:09:27.490 回答