|
своё замыкание каждому объекту.
Пытаюсь добавить своё собственное замыкание каждому объекту типа 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());
|
Потому что this === window
|
Цитата:
|
Да и вообще, чего так мудрить-то?:)
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:
Весь вопрос возник исключительно из интереса возможности реализации :-) Если this === window, то как сослаться на текущее замыкание? Я пробую создать приватное свойство, которое не должно засорять свойства объекта, доступ должен быть исключительно из тела функции. |
Kolyaj:
Можно ли обойтись без прототипов и объявления переменной как свойства объекта, чтобы не убивать котёнка? :-) |
В JS нет приватных свойств, и не надо.
|
Kolyaj:
Ну если Вы не знаете как решить поставленную задачу, зачем мешать? |
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, время: 23:44. |
|