Javascript Google闭包和生成的getter/setter

Javascript Google闭包和生成的getter/setter,javascript,google-closure-compiler,google-closure,kineticjs,Javascript,Google Closure Compiler,Google Closure,Kineticjs,我正在尝试让KineticJS与Google闭包编译器一起工作。然而,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

我正在尝试让KineticJS与Google闭包编译器一起工作。然而,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']);
//添加getter和setter方法
dynamic.Node.addSetters=函数(构造函数,arr){
对于(变量n=0;n
因此,使用addGettersSetters方法,可以根据变量的名称生成getter&setter

然而,Google closure无法解释这一点,并给出警告(不是错误,只是警告,但仍然…):警告-属性setImage从未在Kinetic.Image上定义

我可以为每个getter和setter添加extern。或者,我可以重写所有getter/setter的东西,手工将其变成实际的方法(非生成的方法)。最后一部分似乎是最好的,因为闭包可以优化它们,并用它做一些魔术(我希望)。虽然这将是相当多的工作,所以我想知道,是否可以运行我的程序,生成getter和setter,然后提取它们?或者,如果有人有更好的想法,也欢迎

谢谢!
-Pablo

哪种答案最好取决于您使用的编译模式以及您对库的了解程度

如果您使用的是高级模式,并且使用其他源代码编译库,那么重写可能是最好的(我假设这是您当前正在尝试的)。但是,如果单独加载库或将库源连接到高级编译源,则外部定义是一个不错的选择(如果库维护人员不支持闭包编译器高级编译,则这是一个不错的方法)


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

好的,谢谢。这正是我所想的。我现在正在尝试闭包库,看看将我的项目转换成闭包库有多困难,尽管它的教程少了很多,所以速度还是有点慢:P。我认为这是对我的问题的一个很好的回答。