我正在尝试在高级模式下使用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']


但是,您将失去所有此类属性的重命名和无效代码消除功能。

07-22 23:46
查看更多