Javascript 如何使用下划线创建自己的可继承类
我想构建一个主干。类似对象/类的模型 我查看了主干文档,发现它们通过可继承属性和方法创建了一个可继承的对象/类,分两步进行: I.创建具有某些属性的函数Javascript 如何使用下划线创建自己的可继承类,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,我想构建一个主干。类似对象/类的模型 我查看了主干文档,发现它们通过可继承属性和方法创建了一个可继承的对象/类,分两步进行: I.创建具有某些属性的函数 var Model = Backbone.Model = function(attributes, options) { var defaults; attributes || (attributes = {}); //? if (options && options.parse) attributes
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赋予它一些函数
_.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...
};
我对这种行为有一些疑问:
关于第3行,
attributes | |(attributes={})代码>是一个示例。
如果属性具有falsy valye,则javascript将计算OR表达式的第二部分。该部分为属性
分配一个值{}
,一个空对象。最终结果是,如果属性为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:
expndtw-1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1
创建一个包含所有传入对象属性的新对象是一种标准模式。在第一个示例中,attributes=551;.extend({},默认值,attributes);/代码>该模式用于用可能已传递的内容覆盖默认值。您会在大多数允许您传入选项对象的插件中看到这种模式。如果不传入任何内容,将使用默认值。如果只传入几个属性,其余属性将从默认值中获取它们的值
不完全是一回事。但它非常相似。他们的文档要好得多。你会更好地理解这个概念
编辑2:
该类具有一些与事件处理相关的方法。主干模型类还需要能够使用事件处理。它需要引发事件来告诉视图重新呈现自身,当视图更改基础数据时,它需要侦听来自dom的事件。此事件处理功能可以在定义模型类时从头开始重新编写,也可以扩展模型类以从Events类获取这些方法。后者就是正在发生的事情
如果您阅读了$.extend或uz.extend的文档,您会意识到模型类的扩展不仅包括事件下的属性,还包括其他属性,如toJSON和initialize等 第3行,attributes | |(attributes={})代码>是一个示例。
如果属性具有falsy valye,则javascript将计算OR表达式的第二部分。该部分为属性
分配一个值{}
,一个空对象。最终结果是,如果属性为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:
expndtw-1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1
创建一个包含所有传入对象属性的新对象是一种标准模式。在第一个示例中,attributes=551;.extend({},默认值,attributes);/代码>该模式用于用可能已传递的内容覆盖默认值。您会在大多数允许您传入选项对象的插件中看到这种模式。如果不传入任何内容,将使用默认值。如果只传入几个属性,其余属性将从默认值中获取它们的值
不完全是一回事。但它非常相似。他们的文档要好得多。你会更好地理解这个概念
编辑2:
该类具有一些与事件处理相关的方法。主干模型类还需要能够使用事件处理。它需要引发事件来告诉视图重新呈现自身,当视图更改基础数据时,它需要侦听来自dom的事件。此事件处理功能可以在定义模型类时从头开始重新编写,也可以扩展模型类以从Events类获取这些方法。后者就是正在发生的事情
如果您阅读了$.extend或uz.extend的文档,您会意识到模型类的扩展不仅包括事件下的属性,还包括其他属性,如toJSON和initialize等 关于第6行的内容-创建的对象包含默认值
对象的所有属性以及属性
对象的所有属性。
默认值
对象中已在属性
对象中定义的任何属性都将被后者的值覆盖。至于第6行发生了什么-创建的对象包含默认值
对象的所有属性以及属性
对象的所有属性。
默认值
对象中已在属性
对象中定义的任何属性都将被后者的值覆盖。您好,谢谢您的回答:)第三点怎么了