javascript - 闭包编译器、​​主干和元编程

标签 javascript backbone.js google-closure-compiler

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

相关文章:

momentjs - 使用 google 闭包和高级优化编译 moment.js

google-closure-compiler - 为什么 Closure Compiler 不重命名具有特定名称的对象?

backbone.js - 无法让 iscroll4 与主干 View 一起播放

javascript - 如何使用 JavaScript 或 jQuery 从 URL 下载文件?

javascript - 使用 Ebay API GetSellerList 抓取大图像

javascript - 随着时间的推移,链接 addEventListeners 将导致性能低下

javascript - Backbone.js 中的自定义 REST api 响应

java - 使用注释在剩余调用中传递 JSON 参数

javascript - 使用 Google Closure 编译器时在浏览器和 node.js 之间共享 JS 的最佳方式

javascript - 如何以不区分大小写的方式删除字符串中的重复字母,以便该字母只出现一次?