Google Closure和生成的getter/setter

3

我想让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 Closure无法解释这一点,并给出警告(不是错误,只是警告,但还是...):警告 - Kinetic.Image上从未定义过属性setImage。

我可以为每个getter和setter添加外部引用。或者,我可以手动重写所有getter/setter内容,使其成为实际方法(非生成的方法)。最后一部分似乎是最好的选择,因为然后Closure可以优化它们并对其进行一些魔法操作(我希望如此)。虽然那将是相当多的工作,所以我想知道是否可能运行我的程序,以生成getter和setter,然后提取它们?或者,如果有更好的建议,也欢迎提出。

谢谢! -Pablo

1个回答

3
哪种答案最好取决于您正在使用哪种编译模式以及您正在使用库的方式。如果您正在使用ADVANCED模式并将库与其他源代码一起编译,则重写可能是最佳选择(我假设这是您目前正在尝试做的)。然而,如果您正在单独加载库或将库源代码串联到您的ADVANCED编译源代码中,则extern定义是一个不错的选择(如果库维护人员不支持Closure Compiler ADVANCED编译,则这是一个很好的方法)。人们已经创建了各种工具来帮助自动生成库的外部定义,但最好的方法通常是有人创建并随着库一起维护externs定义。一些库的externs定义托管在Closure Compiler源代码存储库中,并由社区维护,因此您始终可以选择这个选项。

好的,谢谢。这基本上就是我想的。我现在正在尝试使用Closure Library,看看将我的项目转换为它有多难,尽管它的教程要少得多,所以进展有点慢:P 不过,我认为这是对我的问题的一个很好的答案。 - The Oddler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接