Я провел последние пару дней, исследуя способ иметь частные или защищенные свойства в классах MooTools. Различные статьи (например, Шон МакАртур Получение частных переменных в классе MooTools ) предлагают подход для устаревших версий MooTools, но мне не удалось найти рабочий метод для MooTools 1.3+.
Сегодня, после нескольких часов игры с кодом, я думаю , что создал подходящее решение. Я говорю «подумай», потому что на самом деле я не настолько опытен в программировании. Я надеялся, что сообщество здесь сможет проверить мой код и сказать, действительно ли это правильное решение или эмуляция взлома.
var TestObj = (function() {
var _privateStaticFunction = function() { }
return new Class({
/* closure */
_privates: (function() {
return function(key, val) {
if (typeof(this._data) == 'undefined') this._data = {};
/* if no key specified, return */
if (typeof(key) == 'undefined') return;
/* if no value specified, return _data[key] */
else if (typeof(val) == 'undefined') {
if (typeof(this._data[key]) != 'undefined') return this._data[key];
else return;
}
/* if second argument, set _data[key] = value */
else this._data[key] = val;
}
/* tell mootools to hide function */
})().protect(),
initialize: function() {},
get: function(val) { return this._privates(val); },
set: function(key,val) { this._privates(key,val); }
})
})();
obj1 = new TestObj();
obj2 = new TestObj();
obj1.set('theseShoes','rule');
obj2.set('theseShoes','suck');
obj1.get('theseShoes') // rule
obj2.get('theseShoes') // suck
obj1._privates('theseShoes') // Error: The method "_privates" cannot be called
obj1._privates._data // undefined
obj1._privates.$constructor._data // undefined
Я очень ценю любые советы! Спасибо всем!
РЕДАКТИРОВАТЬ : Ну, это неловко. Я забыл проверить очевидное, obj1._data. Я не думал, что this будет ссылаться на объект экземпляра! Итак, я отстой. Тем не менее, любые идеи будут потрясающими!