Я не знаю как правильно сказать, но как сделать свойство, которое было бы не видно внешне, но было бы видно методам установленных через прототип? Вот типа -
var Class = function(){
var _array = []; // приватное или протектед свойство
};
Class.prototype.method = function(){
// как обратиться здесь к _array?
};
Возможно такое сделать из коробки?
Ответ
Средства языка такого, насколько я знаю, не предоставляют. Поэтому javascript-еры договорились, что все свойства которые начинаются со знака нижнего подчеркивания '_' являются приватными. В вашем случае:
var Class = function(){
this._array = []; // приватное или протектед свойство
};
Class.prototype.method = function(){
// как обратиться здесь к _array?
this._array
};
var instance = new Class();
instance._array.push('string') // но мы то знаем, что так делать нельзя
Update
Появилась идея. Шифровать имя свойства и делать его enumerable. Костыль:
var prive = function (that, propName, newValue) {
var decodeStr = function (str) {
return Array.prototype.map.call(
str,
function (char, i) {
return String.fromCharCode(str.charCodeAt(i)-5)
}).join('');
},
decodedPropName = decodeStr(propName);
if (arguments.length >= 3) {
// set private property
Object.defineProperty(that, decodedPropName, {
enumerable: false,
writable: true,
value: newValue,
});
} else {
//get private property
return that[decodedPropName];
}
}
Демонстрация
Комментариев нет:
Отправить комментарий