1

オブジェクト/クラスのような Backbone.Model を構築したい。

バックボーンのドキュメントを調べたところ、継承可能な属性とメソッドを備えた継承可能なオブジェクト/クラスが2つのステップで作成されていることがわかりました。

I. いくつかの属性を持つ関数を作成する

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. Events オブジェクトに「_.extend」を追加するのはなぜですか? パラメータとして他に何を指定できますか?

他に注意すべきことはありますか?

よろしく

4

2 に答える 2

3

行 3は、短絡評価attributes || (attributes = {});の例です。属性に偽の値がある場合、javascript は OR 式の 2 番目の部分を評価します。その部分は、空のオブジェクトである の値を割り当てます。最終結果は、属性が null または未定義の場合 (典型的なケース)、属性に空のオブジェクトを割り当てます。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、つまり、null または未定義ではなく、optionsオブジェクトに と呼ばれる有効なプロパティがある場合、属性に;parseの値を割り当てます。this.parse(attributes)

編集1:

行はUnderscore.js documentation_.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オブジェクトからのすべてを含むオブジェクトが作成されattributesます。defaultsオブジェクトですでに定義されているオブジェクトのプロパティはattributes、後者の値で上書きされます。

于 2012-07-13T09:09:27.490 に答える