0

JavaScriptプロトタイプをjQueryの.data()関数と一緒に使用しようとしています。私のコードは次のようになります。

el = this.element;

el.data("state", {
   someValue: null,
   anotherValue: function() {
      this._val = 0;
   }
});

el.data("state").anotherValue.prototype.getValue = function() {
   return this._val;
}

el.data("state").anotherValue.prototype.setValue = function(val) {

   if (val === Infinity || val < 1) {
      this._val = 1;
   } else {
      this._val = val;
   }

}

console.log(el.data("state").anotherValue.getValue());

これはうまくいかないようです。理由を知りたいだけです。

このコードを実行すると、次のようになります。

Uncaught TypeError: Object function () {
   this._val = 0;
} has no method 'getValue'

ウィジェットファクトリに基づくjQueryプラグインに取り組んでおり、このプラグイン内に管理可能なステートマシンを構築したいと考えています。これは、プラグインの現在の状態を保存してアクセスできる中心的な場所です。これを試してみたい理由の1つは、特定の値が変化するかどうかを監視し、変化したときに他のことをトリガーできるようにしたいということです。.data()関数を使用してデータを保存する必要があります。これは、データを要素に関連付ける必要があるためです。そうしないと、同じページにプラグインの複数のインスタンスを取得したときに奇妙なことが起こります。

4

1 に答える 1

0

プロトタイプはここに行く方法ではないようです。代わりに、セッターとゲッターを使用してみます。ブラウザの互換性について100%確信はありませんが、上記の例を書き直すと、コードは次のようになります。

el = this.element;

el.data("someValue", { 
   val: null,
   get value() { return this.val; },
   set value(val) { 
      if (val === Infinity || val < 1) {
         this.val = 1;
      } else {
         this.val = val;
      }
});

console.log(el.data("someValue").value);
el.data("someValue").value = 0;
console.log(el.data("someValue").value);

このコードを実行すると、次の出力が得られます(Google Chromeで)。

null
10

このように実装すると、チェックを実行して、変数の値が変更またはアクセスされたときに処理を実行できます。これは予備的なコードであることを忘れないでください。いくつかのプラットフォームのいくつかのブラウザで実行する時間がありませんでした。このブログ投稿を読むと、IE8とのブラウザーの互換性の問題があるようです。

于 2012-10-08T08:07:12.983 に答える