Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 11.12.2012, 21:54
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

cib,

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

Сообщение от Hoshinokoe Посмотреть сообщение
cib,

В этой ветке уже все разобрали.
Вы видимо невнимательно прочитали вопрос. У меня нет проблем с вызовом чего-то в таймере или интервале, у меня проблема с контекстом выполнения и областью видимости уже при выполнении вызванной функции. А в указанном Вами посте (который я уже прочитал перед тем как создавать свой) обсуждаются способы указания первого параметра таймера (в скобках ,в анонимке и т.п.), а в конце ссылка на статью по общей информации по областям видимости.
Если я не прав - ткните меня носом в недопонятые мною сообщения в том посте.
Ответить с цитированием
  #4 (permalink)  
Старый 11.12.2012, 22:10
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от cib
может начать ругать и на "privateMethod() is not a function".
чего бы это? а ?
Сообщение от cib
function privateMethod(){
if( privateField1 == ... ) { //do something }
if( privateField2 == ... ) { //do something else }
if( this.publicField == ... ) { //do something else else }
},
как функции объявлять знаете? а различия синтаксиса в литерале и в конструкторе?
Сообщение от cib
privateField1 вообще становится частью объекта window и его модификация в разных контекстах приводит к тому, что одновременно существуют window.privateField1, MyObj.proivateField1 и this.privateField1
тоже странно...
как вызывать конструктор объекта знаете?

Последний раз редактировалось dmitriymar, 11.12.2012 в 22:14.
Ответить с цитированием
  #5 (permalink)  
Старый 11.12.2012, 22:14
Аватар для tropiko
Аспирант
Отправить личное сообщение для tropiko Посмотреть профиль Найти все сообщения от tropiko
 
Регистрация: 23.06.2011
Сообщений: 44

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();
Ответить с цитированием
  #6 (permalink)  
Старый 11.12.2012, 22:17
Аватар для cib
cib cib вне форума
Интересующийся
Отправить личное сообщение для cib Посмотреть профиль Найти все сообщения от cib
 
Регистрация: 11.12.2012
Сообщений: 16

Сообщение от dmitriymar
чего бы это? а ?
ругается "при разных манипуляциях"... это я к тому, что пробовал по-разному

Сообщение от dmitriymar
как функции объявлять знаете? а различия синтаксиса в литерале и в конструкторе?
к чему такой сарказм? вы же всерьез не считаете, что я скопипастил код из рабочего скрипта? руками же набирал, упустил ключевое слово, теперь исправил. Проблема от этого никуда не исчезла.
Ответить с цитированием
  #7 (permalink)  
Старый 11.12.2012, 22:38
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

Сообщение от Hoshinokoe Посмотреть сообщение
cib,

В этой ветке уже все разобрали.
В указанной ветке была замечательная ссылка на учебник, в котором описан контекст выполнения функция setTimeout c примерами.
Ответить с цитированием
  #8 (permalink)  
Старый 11.12.2012, 22:38
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

реально это тема минимум раз в день создается/высплывает или мне кажется?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #9 (permalink)  
Старый 11.12.2012, 23:01
Аватар для cib
cib cib вне форума
Интересующийся
Отправить личное сообщение для cib Посмотреть профиль Найти все сообщения от cib
 
Регистрация: 11.12.2012
Сообщений: 16

Я как Винни-Пух - "ничего не понимаю".
Скопипастил пример 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();
Ответить с цитированием
  #10 (permalink)  
Старый 11.12.2012, 23:32
Аватар для cib
cib cib вне форума
Интересующийся
Отправить личное сообщение для cib Посмотреть профиль Найти все сообщения от cib
 
Регистрация: 11.12.2012
Сообщений: 16

всё, считаю тему закрытой.
отдельное спасибо tropiko за "эффект присутствия"
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setTimeout и переход на новую страницу Kubik129 Общие вопросы Javascript 3 03.02.2012 18:21
не понимаю как задать правильный контекст loz Dojo toolkit 2 17.02.2011 18:36
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02
setTimeout Воитель Общие вопросы Javascript 5 23.01.2009 10:36