Javascript 为什么主干模型构造函数中有一个额外的变量?
没有必要这样做Javascript 为什么主干模型构造函数中有一个额外的变量?,javascript,backbone.js,Javascript,Backbone.js,没有必要这样做 var Model = Backbone.Model = function(attributes, options) { var attrs = attributes || {}; options || (options = {}); this.cid = _.uniqueId('c'); this.attributes = {}; if (options.collection) this.collection = options.co
var Model = Backbone.Model = function(attributes, options) {
var attrs = attributes || {};
options || (options = {});
this.cid = _.uniqueId('c');
this.attributes = {};
if (options.collection) this.collection = options.collection;
if (options.parse) attrs = this.parse(attrs, options) || {};
attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
this.set(attrs, options);
this.changed = {};
this.initialize.apply(this, arguments);
};
as属性不在任何其他地方使用。可以将其视为选项。只需将构造函数参数更改为attrs
,并去掉参数
var attrs = attributes || {};
请注意,有3个类似属性的变量。传入的参数
attributes
、实例变量this.attributes
以及局部变量和可能的额外局部变量attrs
通常情况下,代码将包含一些变量,这些变量不是严格必需的,但有助于提高可读性或减少混淆。在这种情况下,可能需要将局部作用域变量与模型的this.attributes
属性区分开来。您所断言的并不完全正确。属性
散列被复制到属性
中,该属性随后被就地修改;但是,初始参数attributes
会被完全传递给initialize.apply
您还可以编写this.initialize.call(this,attributes,options)
使其更加明确
attrs
是属性的可变*副本<代码>选项
仅可读取,不可写入,因此不需要副本
*JavaScript中的一切都是可变的,但这段代码的行为就好像参数是不可变的。这不太正确<代码>属性是对与
属性
相同的对象的引用,因此代替属性
的更新也会影响属性
。如果代码是var attrs=54;.clone(attributes)|{}
那么您就对了。@WillDemaine\默认值({}…
负责克隆仍然不能保证属性是不变的,因为它在调用\默认值
之前被传递给this.parse
(作为属性)。
var Model = Backbone.Model = function(attrs, options) {
attrs || (attrs = {});