|
своё замыкание каждому объекту.
Пытаюсь добавить своё собственное замыкание каждому объекту типа 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, время: 05:21. |
|