Closure编译器,Backbone和元编程

时间:2012-08-23 15:04:36

标签: javascript backbone.js google-closure-compiler

我正在尝试在高级模式下使用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和其他方法来处理属性名称的字符串文字。

2 个答案:

答案 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)使用简单模式并放弃属性重命名和全局死代码删除。