2

私は、拡張モードで Closure Compiler と互換性があることを望むライブラリを作成しています。ライブラリ内のほとんどのオブジェクトは、API の一部であることが多い属性の内部オブジェクトを保持しているため、ソース ファイルはこのような非常に多くの関数でいっぱいになります。

/*
 * Get name.
 */
Layer.prototype.getName = function() {
    return this.attrs.name;
}
/*
 * Set name.
 */
Layer.prototype.setName = function(name) {
    this.attrs.name = name;
}

コードを少し整理するためにこれを最適化する方法は 10 億通り考えられます。一例: KineticJS は、この関連する質問に従って、次のようなことを行います。

Global.addGettersSetters = function(obj, property) {
    obj['get'+property] = function() { return this.attrs[property] }
    obj['set'+property] = function(val) { this.attrs[property] = val }
}

// Later that day, in our original object, we have:

Global.addGettersSetters(Layer, 'name');

私の理解では、これは Closure Compiler ではノーノーです。Layer のプロパティを文字列として指定しているため、名前は短縮されず、関数は最適化されません。

では、コードを乱雑にすることなく、インターフェイスを完全かつ適切に定義する方法はありますか? Closure Library で見落としているものがあるのではないでしょうか?

別の解決策: 最新の JS で C# スタイルのプロパティを実行する方法はありますか? ある意味で、Closure Compilerは許容できると思いますか? 私はこのライブラリで Webkit と Webkit のみをターゲットにする余裕があるので、まだ完全に実装されていないものは問題ありません。

4

4 に答える 4

1

動的な「addGettersSetters」関数は実行時にのみ使用されるため、Closure Compiler によってコンパイル (および縮小/難読化) できる関数を動的に追加することはできません。コンパイラを使用することの欠点は、コンパイル済みのコードが重複することですが、利点は、ゲッターとセッターが使用される場所の大部分が縮小されるか、変数へのインライン参照に変更されることです。

また、明示的なゲッター/セッターを配置し、JsDoc アノテーションで適切に注釈を付けることによって:

 /*
 * Set name.
 * @param {string} name
 */
Layer.prototype.setName = function(name) {
    this.attrs.name = name;
}

誰かが "setName(5)" を呼び出した場合にコンパイル中に警告が表示されるように、コードにある程度のタイプ セーフを追加できます。

それ以外の場合は、クリスの提案に従い、JS ゲッター/セッターを調べます (他の参照はこちら)。ただし、これらをクロージャコンパイラで使用したことはないため、保証できません。

于 2013-04-25T13:02:07.890 に答える
0

申し訳ありませんが、ne8il の回答と、それが正しいとマークされた理由がわかりません。

次のようにと.prototypeの間に追加するだけで、やりたいことができます。obj[

function addGettersSetters(obj, property) {
    // You can also add this if you don't want to declare attrs = {} each time
    // if (!("attrs" in obj.prototype)) obj.prototype.attrs = {};
    obj.prototype['get'+property] = function() { return this.attrs[property] }
    obj.prototype['set'+property] = function(val) { this.attrs[property] = val }
}

また、プロパティ名も大文字で書きます。次に、次のように使用できます。

var Layer = function() { this.attrs = {}; };
// Or just: 'var Layer = function(){};' if you use the line commented above

addGettersSetters(Layer, 'Name');

var layer = new Layer();
layer.setName("John");
alert(layer.getName()); // "John"
于 2013-12-09T15:48:05.857 に答える
0

元の質問の完全な回答ではなく、情報を追加するだけです。

さまざまな JavaScript OOP フレームワークがゲッター/セッターを処理する方法を確認できます。たとえば、jsPerf.com - ゲッターとセッターを使用した JavaScript オブジェクト指向ライブラリ ベンチマーク

コードを乱雑にすることなく、インターフェイスを完全かつ適切に定義する方法はありますか?

Tan Nhu (ベンチマークの最初の作成者) は、 httpsjsface ://github.com/tnhu/jsface で入手できる独自の OOP ライブラリを作成しました。

私はそれが好きです、私はまさにこの理由でそれを使用します

編集: TypeScript でゲッター/セッター ジェネレーターがどのように解決されるかについては、たとえば、SO 記事のget and set in TypeScriptで言及されています。

他のフレームワークとゲッター/セッターをエンコードする方法の完全なリストについては、List of languages that compile to JS · jashkenas/coffeescript Wiki · GitHub を確認してください。

于 2014-05-28T06:39:57.530 に答える