2

次のようなメソッドを使用する JS ライブラリがあります。

this.on('doAction', function (args) {
   console.log(args.name);
   console.log(args.arg1 + ' ' 9 args.arg2);
});
this.trigger('doAction', {name: 'write', arg1: 1, arg2: 2});

しかし、高度な最適化の後、オブジェクトのプロパティnameは 、、arg1arg2なる ためa、ハンドラーでそれらを取得できません。プロパティ名に引用符を使用して変更を防ぐことができることは知っていますが、次のような特別なユーティリティ関数のようなより良いアプローチはありますか?bcdoAction

this.trigger('doAction', MYAPP.util.intoObject{name: 'write', arg1: 1, arg2: 2});

オブジェクトのプロパティ名を保存できますか?

4

2 に答える 2

3

すべてのプロパティの名前を一貫して変更する必要があります。たとえば、あなたの例は次のようにコンパイルされます:

this.c("doAction", function(a) {
  console.log(a.name);
  console.log(a.a + " " + a.b)
});
this.d("doAction", {name:"write", a:1, b:2});

プロパティの名前が変更されていないことがわかります。実験的な型ベースの最適化が有効になっていない限り、この動作は常に当てはまりますが、それでもこの特定のケースは適切に処理する必要があります。

プロパティの名前を絶対に変更したくない場合は、extern ファイルでインターフェイスを定義し、メソッドをその型になるように型キャストできます。

/** @externs */
/** @interface */
function myInterface() {}
/** @type {number} */
myInterface.prototype.arg1 = 0;

そしてあなたの例では:

this.on('doAction', /** @param {myInterface} args */  function (args) {
   console.log(args.name);
   console.log(args.arg1 + ' ' + args.arg2);
});
this.trigger('doAction',
  /** @type {myInterface} */ ({name: 'write', arg1: 1, arg2: 2}));
于 2013-03-31T01:55:00.923 に答える
0

オブジェクトベースのプロパティを必要とするjqueryメソッドを使用しているときに、この問題に遭遇しました。すべてのキー名を引用符で囲むことで解決しましたが、クロージャーコンパイラーはそれらを台無しにしませんでした。

したがって、上記のコードは次のようになります。

this.trigger('doAction', {'name': 'write', 'arg1': 1, 'arg2': 2});
于 2013-11-12T20:56:36.837 に答える