Прототип JavaScript, используемый вместе с функцией JQuery.data()?

Я пытаюсь использовать прототипы JavaScript вместе с функцией jdu (.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 на основе фабрики виджетов и хочу создать управляемый конечный автомат внутри этого плагина - центральное место, где я могу хранить и получать доступ к текущему состоянию плагина. Одна из причин, по которой я хочу попробовать это, заключается в том, что я хочу иметь возможность отслеживать, изменяются ли определенные значения, и запускать другие вещи при их изменении. Мне нужно хранить данные с помощью функции.data(), так как они должны быть привязаны к элементу. В противном случае странные вещи случаются, когда вы получаете несколько экземпляров плагина на одной странице.

1 ответ

Решение

Прототип, похоже, не является подходящим способом. Вместо этого я собираюсь попробовать использовать сеттеры и геттеры. Я не уверен на 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.

Другие вопросы по тегам