1

我正在尝试在高级模式下使用 Backbone.js 和 Closure Compiler。Backbone.Model我编写了一个方便的函数,它为我的 s using创建 getter/setter Backbone.Model.defaults,它看起来像这样:

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与其他方法一起使用字符串文字作为属性名称。

4

2 回答 2

1

您正在使用引用的语法定义您的属性:

props[attr]

但是当您尝试通过点语法访问它们时,就会出现问题:

model.color

在 ADVANCED_OPTIMAZATIONS 中,一个基本规则是您必须一致地引用属性。请参阅https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames

听起来最简单的答案可能是对这些属性使用带引号的语法:

model['color']

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

于 2012-08-23T15:35:06.500 回答
1

您动态创建的任何属性在高级模式下都是“外部”的,您有三种选择:(1) 使用带引号的访问(如 Chad 建议的那样)或 (2) 创建外部或 (3) 使用简单模式并放弃属性重命名和全局死代码删除。

于 2012-08-23T23:54:58.630 回答