如何使用下划线创建自己的可继承类

时间:2012-07-13 08:49:24

标签: javascript backbone.js underscore.js

我想构建一个类似于object / class的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);
};

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

_.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 个答案:

答案 0 :(得分:3)

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

这一行相当于说:

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对象,即它不为null或未定义,并且options对象具有名为parse的有效属性,则为属性赋值this.parse(attributes) ;

编辑1:

_.extend行可以解释为Underscore.js documentation

它是一个标准模式,用于创建一个新对象,该对象将包含所有传入对象的属性。在第一个示例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等)进行扩展...... / p>

答案 1 :(得分:1)

关于第6行发生的事情 - 创建的对象包含defaults对象的所有属性以及来自attributes对象的所有属性。 已在defaults对象中定义的attributes对象的任何属性都将被后者的值覆盖。