我正在尝试在高级模式下使用 Backbone.js 和 Closure Compiler。我写了一个方便的函数,它使用 Backbone.Model.defaults
为我的 Backbone.Model
创建 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')
)?
更新 当然,这将如何与 Backbone.Model.hasChanged
和其他采用字符串文字作为属性名称的方法一起使用。
最佳答案
您正在使用引用语法定义您的属性:
props[attr]
但是当您尝试通过点分语法访问它们时,您的问题就出现了:
model.color
在 ADVANCED_OPTIMAZATIONS 中,一个基本规则是您必须一致地引用一个属性。参见 https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames
听起来最简单的答案可能是对这些属性使用引号语法:
model['color']
但是,您将失去此类属性的所有重命名和死代码消除。
关于javascript - 闭包编译器、主干和元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12094698/