И снова контекст в 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, время: 21:18. |