как спрятать переменные
Так называемые «классы» в js, никогда не создавал. Мне нужно решить две проблемы, с которыми я столкнулся. Вот они:
1. Необходимо спрятать данные. 2. Методы не должны определяться каждый раз при создании объекта. Вот варианты «классов»:
// вариант 1
var Base = function (name) {
this.name = name; // переменная видна, как ее спрятать? Проблема №1
};
Base.prototype.getName = function………………и т.д
// вариант 2
var Base = function (name) {
var getName = function () { return name; }; // проблема №2
return { getName: getName };
};
// вариант 3
var Base = function () {
var getName = function () { return this.name; }; // замыкаем метод
return function (name) {
var obj = {name: name};
return {
getName: getName.bind(obj)
};
};
};
Хотелось бы знать, какие варианты «классов» еще существуют? |
Цитата:
Цитата:
|
var Base = (function () {
var hideParam = "Скрытое поле"; //Объект Base сможет пользоваться этой переменной, а другие - нет.
var Base = function (name) {
this.name = hideParam;
};
return Base;
})();
|
Цитата:
|
Цитата:
|
Цитата:
на всякий случай: ".bind" - это п.2 |
можно сделать искусственный вариант, но придется вручную освобождать память, если объект более не нужен:
var Base = (function() {
var prnum = 0, privates = {};
function cls(name) {
this._id = ++prnum;
privates[this._id]= {
name: name
};
}
cls.prototype.getName = function() {
var data = privates[this._id];
return data.name;
};
cls.prototype.destroy = function() {
if (this._id) {
delete privates[this._id];
delete this._id;
}
};
return cls;
})();
var obj1 = new Base("n1");
var obj2 = new Base("n2");
var obj3 = new Base("n333");
alert(obj1.getName() + " " + obj2.getName() + " " + obj3.getName());
obj1.destroy(); // obj1 теперь убит
теперь вместо приватных данных виден только номер. хотя его тоже можно поменять. так что это всё особого практического смысла не имеет. |
Цитата:
|
в последнем проекте я делал так:
this._private = {}; // тут все приватное
|
спб всем, сделаю так
var Base = function (name) {
this.privates = {};
this.privates.name = name;
};
|
| Часовой пояс GMT +3, время: 05:43. |