Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   своё замыкание каждому объекту. (https://javascript.ru/forum/misc/12103-svojo-zamykanie-kazhdomu-obektu.html)

cainrus 30.09.2010 17:07

своё замыкание каждому объекту.
 
Пытаюсь добавить своё собственное замыкание каждому объекту типа 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());

Sweet 30.09.2010 17:22

Потому что this === window

Kolyaj 30.09.2010 17:28

Цитата:

Сообщение от cainrus
Object.prototype.key

Когда вы добавляете что-то своё в Object.prototype, бог убивает котёнка.

Sweet 30.09.2010 17:29

Да и вообще, чего так мудрить-то?:)
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());

Sweet 30.09.2010 17:29

Цитата:

Сообщение от Kolyaj
Когда вы добавляете что-то своё в Object.prototype, бог убивает котёнка.

:haha: Жжешь!

cainrus 30.09.2010 17:38

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

Если this === window, то как сослаться на текущее замыкание?
Я пробую создать приватное свойство, которое не должно засорять свойства объекта, доступ должен быть исключительно из тела функции.

cainrus 30.09.2010 17:42

Kolyaj:
Можно ли обойтись без прототипов и объявления переменной как свойства объекта, чтобы не убивать котёнка? :-)

Kolyaj 30.09.2010 17:46

В JS нет приватных свойств, и не надо.

cainrus 30.09.2010 17:48

Kolyaj:
Ну если Вы не знаете как решить поставленную задачу, зачем мешать?

Sweet 30.09.2010 17:56

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());


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