Прототип 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.