我正在尝试在高级模式下使用Backbone.js和Closure Compiler。我写了一个方便的函数,使用Backbone.Model
为我的Backbone.Model.defaults
创建getter / 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')
)?
UPDATE 当然,如何使用Backbone.Model.hasChanged
和其他方法来处理属性名称的字符串文字。
答案 0 :(得分:1)
您使用引用语法定义属性:
props[attr]
但是当您尝试通过虚线语法访问它们时,您的问题就出现了:
model.color
在ADVANCED_OPTIMAZATIONS中,基本规则是您必须始终引用属性。见https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames
听起来最简单的答案可能是您使用这些属性的引用语法:
model['color']
但是,对于此类属性,您将失去所有重命名和死代码。
答案 1 :(得分:1)
您在高级模式下动态创建的任何属性都是“外部”,您有三种选择:(1)使用引用访问(如Chad建议)或(2)创建外部或(3)使用简单模式并放弃属性重命名和全局死代码删除。