我想构建一个类似于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...
};
我对此行为有一些疑问:
还有什么我需要注意的吗?
此致
答案 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
对象的任何属性都将被后者的值覆盖。