Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2013, 00:06
Интересующийся
Отправить личное сообщение для finestra Посмотреть профиль Найти все сообщения от finestra
 
Регистрация: 28.02.2013
Сообщений: 13

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


Хотелось бы знать, какие варианты «классов» еще существуют?
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2013, 01:19
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Сообщение от finestra
Необходимо спрятать данные.
А зачем? Если речь идет о внутренней разработке, то инкапсуляцию можно реализовать просто договорившись, как обозначаются private и protected члены классов (например, начинать имена с "_"). Просто, если private еще можно реализовать через замыкания, то с protected вряд ли как-либо получится.
Сообщение от finestra
Методы не должны определяться каждый раз при создании объекта.
К слову, это проблема только при частом инстанцировании объектов.
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2013, 12:54
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

var  Base = (function () {
  var hideParam = "Скрытое поле"; //Объект Base  сможет пользоваться этой переменной, а другие - нет.
  var Base = function (name) {
    this.name = hideParam; 
  };
  return Base;
})();
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2013, 13:12
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от tsigel
Объект Base  сможет пользоваться этой переменной, а другие - нет.
А еще - она будет общей для всех инстансов!
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 23.12.2013, 14:25
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от danik.js
А еще - она будет общей для всех инстансов!
Не спорю.
Ответить с цитированием
  #6 (permalink)  
Старый 23.12.2013, 16:28
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

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

на всякий случай: ".bind" - это п.2
Ответить с цитированием
  #7 (permalink)  
Старый 23.12.2013, 17:24
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

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


теперь вместо приватных данных виден только номер.
хотя его тоже можно поменять.
так что это всё особого практического смысла не имеет.
Ответить с цитированием
  #8 (permalink)  
Старый 23.12.2013, 22:54
Интересующийся
Отправить личное сообщение для finestra Посмотреть профиль Найти все сообщения от finestra
 
Регистрация: 28.02.2013
Сообщений: 13

Сообщение от Яростный Меч Посмотреть сообщение
на всякий случай: ".bind" - это п.2
не ожидал такого от bind. спб за инфу
Ответить с цитированием
  #9 (permalink)  
Старый 24.12.2013, 00:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

в последнем проекте я делал так:
this._private = {}; // тут все приватное
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #10 (permalink)  
Старый 29.12.2013, 00:06
Интересующийся
Отправить личное сообщение для finestra Посмотреть профиль Найти все сообщения от finestra
 
Регистрация: 28.02.2013
Сообщений: 13

спб всем, сделаю так
var Base = function (name) {
	this.privates = {};
	this.privates.name = name;
};
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как добавить в ссылку $_GET переменные Mukhtar Events/DOM/Window 8 08.03.2013 04:53
Как вы передаёте в js переменные с сервера без ajax? akostrikov Серверные языки и технологии 1 09.10.2011 21:45
Как организовать RichEdit arma Элементы интерфейса 2 18.02.2010 14:57