Google Closure和生成的getter / setter

时间:2012-09-02 23:30:46

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

我正在努力让KineticJS与Google Closure Compiler合作。然而,KineticJS产生了它的吸气剂和放大器。基于变量名称的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&amp;基于变量名称的setter。

谷歌关闭不能解释这一点,并给出警告(不是错误,只是警告,但仍然......):警告 - 属性setImage从未在Kinetic.Image上定义

我可以为每个吸气剂添加外部电流&amp;二传手。或者,我可以重写所有getter / setter的东西,手工制作实际的方法(非生成的方法)。最后一部分似乎是最好的,从那以后Closure可以优化它们并用它做一些魔术(我希望。)虽然这将是相当多的工作,所以我想知道,是否可以运行我的程序,所以它生成吸气剂和放大器setter,然后提取它们?或者,如果有人有更好的想法,那也是受欢迎的。

谢谢! -Pablo

1 个答案:

答案 0 :(得分:3)

哪个答案最好取决于您使用的编辑模式以及您是如何使用库的。

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

人们已经创建了各种工具来帮助自动生成库的外部程序,但通常最好是有人创建外部程序并使用库维护它们。一些库外部存储在Closure Compiler源代码存储库中,并由社区维护,因此始终是一个选项。