Javascript.RU

 
 
Опции темы
 
Старый 30.03.2016, 20:05
Аспирант
Отправить личное сообщение для karden Посмотреть профиль Найти все сообщения от karden
 
Регистрация: 16.01.2016
Сообщений: 57

Работа с классами
Разбираюсь с классами.

Сделал такое (вроде все лишнее вычистил, может что лишнее удалил, но суть вопроса будет понятна):

var userData = {};

	class inputUserData {
		constructor(settings) {
			var that = this;
			var initSettings = settings;
			
			if (initSettings.debugMode) {
				console.log('class inputUserData: constructor - Begin');
				console.log('class inputUserData: settings %O', initSettings);
			}
			
// Some code
			return (this);
		} // class inputUserData constructor

		setUserID (UserID) {
			if (initSettings.debugMode) console.log('class inputUserData: setUserID - Begin');
alert(UserID); // Работает
alert (initSettings.appendPlace); // Не работает
			return (this);
		} // setUserID ()

	} // class inputUserData

	var inputUserPhoneSettings = {
		appendPlace:	'inputUserPhone',
	  	debugMode:		true
	};

	let inputUserPhone = new inputUserData (inputUserPhoneSettings);


HTML:

	<table width="100%">
	 <tr id="inputUserPhone"></tr>
	</table>

	$( "#..." ).click( function(){
		inputUserPhone.setUserID(101);
	});


Собственно вопрос в следующем. Не могу понять где общее пространство переменных? Как их объявить в конструкторе, чтобы они были доступны из методов?

И, заодно, не смог найти главу, где описывалась конструкция that = this, чтобы не терять ссылку на нужный объект. Точно помню, что об этом была написана хорошая статья. Надо перечитать.

И, как следствие, если я правильно понимаю, то для того, чтобы можно было вызывать методы одной командой через "." я должен везде (во всех метода) возвращать ссылку на свой объект. Надо ли это делать в конструкторе?

Спасибо.
 
Старый 01.04.2016, 16:55
Аспирант
Отправить личное сообщение для karden Посмотреть профиль Найти все сообщения от karden
 
Регистрация: 16.01.2016
Сообщений: 57

Опять возникла проблема с асинхронностью...

В выше приведенном классе (он уже прилично подрос) есть две функции:

//внутри класса

setUserID (UserID) {
	var self = this;

	userData = {};
	$.ajax()
		.done(function( msg ) {
			userData = jQuery.parseJSON( msg );
			// тут еще всякое...
		}); // ajax.done ()
	return (self);
} // setUserID ()

setCurrentValue (value) {
	var self = this;

	// рработа с userData

	return (self);
} // setCurrentValue () 

// в основном коде

inputUser.setUserID(1).setCurrentValue(2);


Методы запускаются последовательно, но первая функция завершает работу раньше, чем завершился запрос ajax, соответсвенно, вторая функция не имеет данных для своих действий.

Как мне "тормознуть" выход из первой функции до ее реального завершения работы?

Спасибо.
 
Старый 02.04.2016, 13:15
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

Сообщение от karden
that = this
это не конструкция, а костыль, для проброса из динамического вызова в лексическую область
 
Старый 02.04.2016, 13:19
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

Сообщение от karden
Не могу понять где общее пространство переменных?
общее пространство -- цепочка прототипов. Чтобы всегда иметь к нему доступ используйте this в методах
 
Старый 02.04.2016, 13:24
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

надо тут сказать, что классы реализованы криво, там в неймспейсах могут лежать только методы. Если хотите использовать свойства, не используйте сахар для классов, используйте new и Object.create. Вы от этого ничего не потеряете.
 

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вакансия: Программист IOS, работа в офисе,г.Ростов-на-Дону Анна NikitaOnline Работа 0 21.03.2016 18:45
Работа с классами Navil Элементы интерфейса 2 11.02.2014 11:04
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06


© Илья Кантор, 2007-2021 О проекте - Архив форума - Вверх