3

KineticJS を Google Closure Compiler で動作させようとしています。ただし、KineticJS は、変数の名前に基づいてゲッターとセッターを生成しました。

このようなもの:

// 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 メソッドを使用して、変数の名前に基づいてゲッターとセッターを生成します。

ただし、Google のクロージャーはこれを解釈できず、警告が表示されます (エラーではなく、単なる警告ですが、それでも...): WARNING - Property setImage never defined on Kinetic.Image

ゲッターとセッターごとに externs を追加できます。または、すべてのゲッター/セッターを書き直して、実際のメソッド (生成されていないメソッド) を手動で作成することもできます。最後の部分は最高のようです.Closureはそれらを最適化し、それを使っていくつかの魔法を行うことができます.ゲッターとセッター、そしてそれらを抽出しますか?または、誰かがより良いアイデアを持っている場合は、それも大歓迎です。

ありがとう!-パブロ

4

1 に答える 1

3

どの答えが最適かは、使用しているコンパイル モードとライブラリの状態によって異なります。

ADVANCED モードを使用していて、他のソースを使用してライブラリをコンパイルしている場合は、書き直すのがおそらく最善です (これが現在あなたがやろうとしていることだと思います)。ただし、ライブラリを個別にロードするか、ADVANCED コンパイル済みソースにライブラリ ソースを連結する場合は、extern 定義を使用することをお勧めします (ライブラリ管理者が Closure Compiler ADVANCED コンパイルをサポートしていない場合、これは適切な方法です)。

ライブラリの extern を自動生成するために人々が作成したさまざまなツールがありますが、通常は誰かが extern を作成してライブラリで維持するのが最善です。一部のライブラリ extern は、Closure Compiler ソース リポジトリでホストされ、コミュニティによって維持されるため、常にオプションです。

于 2012-09-04T05:20:35.637 に答える