Показать сообщение отдельно
  #1 (permalink)  
Старый 11.12.2012, 21:29
Аватар для cib
cib cib вне форума
Интересующийся
Отправить личное сообщение для cib Посмотреть профиль Найти все сообщения от cib
 
Регистрация: 11.12.2012
Сообщений: 16

И снова контекст в 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 с разными значениями в зависимости от контекста.
Если все поля и методы сделать публичными, то первый метод работает нормально, но теряется управление уровнем доступа для внешних объектов.

Подскажите, в каком месте у меня затуп и ЧЯДНТ?

Последний раз редактировалось cib, 11.12.2012 в 22:14.
Ответить с цитированием