Javascript.RU

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

своё замыкание каждому объекту.
Пытаюсь добавить своё собственное замыкание каждому объекту типа Object, но все новые объекты ссылаются на одно и тоже замыкание.
Как заставить объект создавать своё собственное замыкание?

код:
Object.prototype.key = function(key){
	// замыкание
	var _private = (function(){
		var self = this;
		// set pointer to zero if it's not defined yet
		if (typeof(self.pointer) === 'undefined') self.pointer = 0;
		// define setter & getter functions
		var setter = function(a){self.pointer = a;}
		var getter = function(){return self.pointer;}
		// return functions from clouser
		return {set: setter, get: getter};
	})();
	// поставить переменную в замыкание
	if (!!key) _private.set(key);
	// вернуть переменную из замыкания
	return _private.get();
}

var FirstObject = {};
// set private value for first object
FirstObject.key(100);
var SecondObject = {};
// set private value for second object
SecondObject.key(999);

// возвращает 999, а не 100
alert(FirstObject.key());

Последний раз редактировалось cainrus, 30.09.2010 в 17:09.
Ответить с цитированием
  #2 (permalink)  
Старый 30.09.2010, 17:22
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Потому что this === window
Ответить с цитированием
  #3 (permalink)  
Старый 30.09.2010, 17:28
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от cainrus
Object.prototype.key
Когда вы добавляете что-то своё в Object.prototype, бог убивает котёнка.
Ответить с цитированием
  #4 (permalink)  
Старый 30.09.2010, 17:29
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Да и вообще, чего так мудрить-то?
Object.prototype.key = function(key){
  if (typeof(this.pointer) === 'undefined') this.pointer = 0;
  if (!!key) this.pointer = key;
  return this.pointer;
}

var FirstObject = {}, SecondObject = {};
FirstObject.key(100);
SecondObject.key(999);
alert(FirstObject.key());
Ответить с цитированием
  #5 (permalink)  
Старый 30.09.2010, 17:29
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Kolyaj
Когда вы добавляете что-то своё в Object.prototype, бог убивает котёнка.
Жжешь!
Ответить с цитированием
  #6 (permalink)  
Старый 30.09.2010, 17:38
Интересующийся
Отправить личное сообщение для cainrus Посмотреть профиль Найти все сообщения от cainrus
 
Регистрация: 30.09.2010
Сообщений: 13

Sweet:
Весь вопрос возник исключительно из интереса возможности реализации :-)

Если this === window, то как сослаться на текущее замыкание?
Я пробую создать приватное свойство, которое не должно засорять свойства объекта, доступ должен быть исключительно из тела функции.
Ответить с цитированием
  #7 (permalink)  
Старый 30.09.2010, 17:42
Интересующийся
Отправить личное сообщение для cainrus Посмотреть профиль Найти все сообщения от cainrus
 
Регистрация: 30.09.2010
Сообщений: 13

Kolyaj:
Можно ли обойтись без прототипов и объявления переменной как свойства объекта, чтобы не убивать котёнка? :-)
Ответить с цитированием
  #8 (permalink)  
Старый 30.09.2010, 17:46
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

В JS нет приватных свойств, и не надо.
Ответить с цитированием
  #9 (permalink)  
Старый 30.09.2010, 17:48
Интересующийся
Отправить личное сообщение для cainrus Посмотреть профиль Найти все сообщения от cainrus
 
Регистрация: 30.09.2010
Сообщений: 13

Kolyaj:
Ну если Вы не знаете как решить поставленную задачу, зачем мешать?
Ответить с цитированием
  #10 (permalink)  
Старый 30.09.2010, 17:56
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Object.prototype.key = function(key){
	*!*var self = this;*/!* //Вынеси self из _private, чтобы сделать ссылку на объект
	// замыкание
	var _private = (function(){
		// set pointer to zero if it's not defined yet
		if (typeof(self.pointer) === 'undefined') self.pointer = 0;
		// define setter & getter functions
		var setter = function(a){self.pointer = a;}
		var getter = function(){return self.pointer;}
		// return functions from clouser
		return {set: setter, get: getter};
	})();
	// поставить переменную в замыкание
	if (!!key) _private.set(key);
	// вернуть переменную из замыкания
	return _private.get();
}

var FirstObject = {};
// set private value for first object
FirstObject.key(100);
var SecondObject = {};
// set private value for second object
SecondObject.key(999);

// возвращает 999, а не 100
alert(FirstObject.key());

Последний раз редактировалось Sweet, 30.09.2010 в 17:59.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопр. замыкание Shaci jQuery 6 05.03.2010 12:21