И снова контекст в setTimeout
Доброго времени суток!
Нужно создать объект с приватными и публичными свойствами и методами так, чтобы все части объекта могли работать друг с другом, в т.ч. по таймаутам и интервалам без ограничений видимости, контекста и т.д., ну а внешние объекты - согласно уровню доступа. Наследников не будет. Делаю так: function obj() { privateField1; var privateField2; this.publicField; function privateMethod(){ if( privateField1 == ... ) { //do something } if( privateField2 == ... ) { //do something else } if( this.publicField == ... ) { //do something else else :) } }, this.publicMethod1 = function() { var self = this; setTimeout( function(){ self.privateMethod(); }, interval ); }, this.publicMethod2 = function() { var self = this; setTimeout( function(){ privateMethod.call( self ); }, interval ); } } document.MyObj = new obj(); document.MyObj.publicMethod1(); document.MyObj.publicMethod2(); И получается так, что внутри приватного метода несмотря на передачу контекста значения полей не соответствуют тому, что лежит в экземпляре объекта. При разных манипуляциях способ вызова может начать ругать и на "privateMethod() is not a function". privateField1 вообще становится частью объекта window и его модификация в разных контекстах приводит к тому, что одновременно существуют window.privateField1, MyObj.proivateField1 и this.privateField1 с разными значениями в зависимости от контекста. Если все поля и методы сделать публичными, то первый метод работает нормально, но теряется управление уровнем доступа для внешних объектов. Подскажите, в каком месте у меня затуп и ЧЯДНТ? |
|
Цитата:
Если я не прав - ткните меня носом в недопонятые мною сообщения в том посте. |
Цитата:
Цитата:
Цитата:
как вызывать конструктор объекта знаете? |
function obj(){ var self = this; var privateField = "I'm privateField value"; var privateMethod = function(){ alert('Whoo!'); } self.publicField = "I'm publicField value"; self.publicMethod = function(){ return privateField; } self.publicMethod2 = function(){ setTimeout( function(){ privateMethod.call(self); }, 1000 ); } } var obj = new obj(); console.log(obj.privateField); //Undefined console.log(obj.privateMethod()); //TypeError console.log(obj.publicField); console.log(obj.publicMethod()); obj.publicMethod2(); |
Цитата:
Цитата:
|
Цитата:
|
реально это тема минимум раз в день создается/высплывает или мне кажется? :blink:
|
Я как Винни-Пух - "ничего не понимаю".
Скопипастил пример tropiko, внес туда нужные мне исправления - всё работает. И работает так, как не работало в проекте. Опять вношу изменения в проект (1 в 1 нерабочий вариант из-за которого пост создал) и вуаля! Всё работает. Вот как так? Одного не пойму - почему "this.IncomingQueue is undefined", а "this.EngineRunning == true" ? function obj() { var EngineRunning = true; var IncomingQueue = [ 'element1', 'element2' ]; //и другие свойства this.StartEngine = function() { var self = this; this.ThreadExecID = setTimeout( function(){ setInterval( function() { ThreadExec.call(self); }, self.ExecInterval ); }, self.InterThreadInterval * 2 ); }, var ThreadExec = function(){ if( !this.EngineRunning ) return; if( this.IncomingQueue.length > 0 ) { //.............. } } } var obj = new obj(); obj.StartEngine(); |
всё, считаю тему закрытой.
отдельное спасибо tropiko за "эффект присутствия" |
Часовой пояс GMT +3, время: 11:36. |