javascript - Google Closure 和生成的 getters/setters

标签 javascript google-closure-compiler google-closure kineticjs

我正在尝试让 KineticJS 与 Google Closure Compiler 一起工作。然而,KineticJS 根据变量的名称生成它的 getter 和 setter。

像这样:

// add getter and setter methods
Kinetic.Node.addSetters = function(constructor, arr) {
    for(var n = 0; n < arr.length; n++) {
        var attr = arr[n];
        this._addSetter(constructor, attr);
    }
};
Kinetic.Node.addGetters = function(constructor, arr) {
    for(var n = 0; n < arr.length; n++) {
        var attr = arr[n];
        this._addGetter(constructor, attr);
    }
};
Kinetic.Node.addGettersSetters = function(constructor, arr) {
    this.addSetters(constructor, arr);
    this.addGetters(constructor, arr);
};
Kinetic.Node._addSetter = function(constructor, attr) {
    var that = this;
    var method = 'set' + attr.charAt(0).toUpperCase() + attr.slice(1);
    constructor.prototype[method] = function() {
        var arg;
        if(arguments.length == 1) {
            arg = arguments[0];
        }
        else {
            arg = Array.prototype.slice.call(arguments);
        }
        var obj = {};
        obj[attr] = arg;
        this.setAttrs(obj);
    };
};
Kinetic.Node._addGetter = function(constructor, attr) {
    var that = this;
    var method = 'get' + attr.charAt(0).toUpperCase() + attr.slice(1);
    constructor.prototype[method] = function(arg) {
        return this.attrs[attr];
    };
};
// add getters setters
Kinetic.Node.addGettersSetters(Kinetic.Node, ['x', 'y', 'scale', 'rotation', 'opacity', 'name', 'id', 'offset', 'draggable', 'dragConstraint', 'dragBounds', 'listening']);

因此,使用 addGettersSetters 方法,您可以根据变量的名称生成 getter 和 setter。

Google 闭包无法对此进行解释,并发出警告(不是错误,只是警告,但仍然...):警告 - 属性 setImage 从未在 Kinetic.Image 上定义

我可以为每个 getter 和 setter 添加 externs。或者,我可以重写所有的 getter/setter 内容,手动使其成为实际方法(非生成的方法)。最后一部分似乎是最好的,从那以后 Closure 可以优化它们并用它做一些魔术(我希望。)虽然那会是相当多的工作,所以我想知道,是否可以运行我的程序,所以它生成 setter和getter ,然后提取它们?或者,如果有人有更好的想法,那也很受欢迎。

谢谢! -巴勃罗

最佳答案

哪个答案最好取决于你使用的是哪种编译模式以及你是怎样的库。

如果您正在使用 ADVANCED 模式并使用其他来源编译库,则重写可能是最好的(我假设这就是您当前正在尝试做的)。但是,如果您单独加载库或将库源连接到您的 ADVANCED 编译源,外部定义是一个不错的选择(如果库维护者不支持 Closure Compiler ADVANCED 编译,这是一个很好的方法)。

人们已经创建了各种工具来帮助自动为图书馆生成外部文件,但通常最好是由某人创建外部文件并通过图书馆维护它们。一些库外部托管在 Closure Compiler 源存储库中并由社区维护,因此这始终是一种选择。

关于javascript - Google Closure 和生成的 getters/setters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240591/

相关文章:

javascript - 如何减少 Google 闭包库的大小以进行部署?

php mysql jquery javascript 聊天

javascript - JQuery 在 Jest 测试中检查元素可见性

java - 闭包编译器 : create_name_map_files from Java API

javascript - Dojo 构建如何缩小用 ECMASCRIPT5 编写的代码?

javascript - 为什么我应该使用 goog.ui.Checkbox 而不是常规输入?

javascript - 用jquery删除按钮序列

javascript - 使用 Form 或 HTML 添加获取路由到表

javascript - 为什么 Google Closure Compiler 在原始命名空间为空时向全局命名空间添加变量?

javascript - 关闭编译器删除类 namespace