Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как спрятать переменные (https://javascript.ru/forum/misc/43826-kak-spryatat-peremennye.html)

finestra 23.12.2013 00:06

как спрятать переменные
 
Так называемые «классы» в 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) 
        };
    };
};


Хотелось бы знать, какие варианты «классов» еще существуют?

BallsShaped 23.12.2013 01:19

Цитата:

Сообщение от finestra
Необходимо спрятать данные.

А зачем? Если речь идет о внутренней разработке, то инкапсуляцию можно реализовать просто договорившись, как обозначаются private и protected члены классов (например, начинать имена с "_"). Просто, если private еще можно реализовать через замыкания, то с protected вряд ли как-либо получится.
Цитата:

Сообщение от finestra
Методы не должны определяться каждый раз при создании объекта.

К слову, это проблема только при частом инстанцировании объектов.

tsigel 23.12.2013 12:54

var  Base = (function () {
  var hideParam = "Скрытое поле"; //Объект Base  сможет пользоваться этой переменной, а другие - нет.
  var Base = function (name) {
    this.name = hideParam; 
  };
  return Base;
})();

danik.js 23.12.2013 13:12

Цитата:

Сообщение от tsigel
Объект Base  сможет пользоваться этой переменной, а другие - нет.

А еще - она будет общей для всех инстансов!

tsigel 23.12.2013 14:25

Цитата:

Сообщение от danik.js
А еще - она будет общей для всех инстансов!

Не спорю.

Яростный Меч 23.12.2013 16:28

Цитата:

Сообщение от finestra
1. Необходимо спрятать данные.
2. Методы не должны определяться каждый раз при создании объекта.

эти два пункта несовместимы.

на всякий случай: ".bind" - это п.2

Яростный Меч 23.12.2013 17:24

можно сделать искусственный вариант, но придется вручную освобождать память, если объект более не нужен:
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 теперь убит


теперь вместо приватных данных виден только номер.
хотя его тоже можно поменять.
так что это всё особого практического смысла не имеет.

finestra 23.12.2013 22:54

Цитата:

Сообщение от Яростный Меч (Сообщение 288621)
на всякий случай: ".bind" - это п.2

:blink: не ожидал такого от bind. спб за инфу

nerv_ 24.12.2013 00:55

в последнем проекте я делал так:
this._private = {}; // тут все приватное

finestra 29.12.2013 00:06

спб всем, сделаю так
var Base = function (name) {
	this.privates = {};
	this.privates.name = name;
};


Часовой пояс GMT +3, время: 10:04.