我正在尝试在高级模式下使用Backbone.js和Closure Compiler。我编写了一个方便的函数,它使用Backbone.Model
为我的Backbone.Model.defaults
创建getters / setter,如下所示:
some.defaultProperties = function(ctor) {
if (!ctor.prototype.defaults)
return;
var defattr = function(name) {
return {
get: function() {
return this.get(name);
},
set: function(val) {
var diff = {};
diff[name] = val;
return this.set(diff);
}
};
};
var props = {};
for (var attr in ctor.prototype.defaults) {
if (ctor.prototype.defaults.hasOwnProperty(attr))
props[attr] = defattr(attr);
}
Object.defineProperties(ctor.prototype, props);
};
在CoffeeScript中等同于此处http://srackham.wordpress.com/2011/10/16/getters-and-setters-for-backbone-model-attributes/
现在回到高级模式下的Closure Compiler。它似乎不喜欢它,因为我正在使用普通的属性访问语法(即。重点是
model.color
而不是model.get('color')
。但是Closure正在解决这些问题,因此我得到的是undefined
而不是我的值。任何解决方法? (除了重写所有内容以使用get('attrname')
)?更新当然,这将与
Backbone.Model.hasChanged
以及其他使用字符串文字作为属性名称的方法一起工作。 最佳答案
您正在使用引用的语法定义属性:
props[attr]
但是,当您尝试通过点分语法访问它们时,就会发生问题:
model.color
在ADVANCED_OPTIMAZATIONS中,一个基本规则是必须始终引用属性。见https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames
听起来最简单的答案可能是您对这些属性使用引用的语法:
model['color']
但是,您将失去所有此类属性的重命名和无效代码消除功能。