Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа с классами (https://javascript.ru/forum/misc/62213-rabota-s-klassami.html)

karden 30.03.2016 20:05

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

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

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, чтобы не терять ссылку на нужный объект. Точно помню, что об этом была написана хорошая статья. Надо перечитать.

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

Спасибо.

karden 01.04.2016 16:55

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

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

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

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, соответсвенно, вторая функция не имеет данных для своих действий.

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

Спасибо.

protoquest 02.04.2016 13:15

Цитата:

Сообщение от karden
that = this

это не конструкция, а костыль, для проброса из динамического вызова в лексическую область

protoquest 02.04.2016 13:19

Цитата:

Сообщение от karden
Не могу понять где общее пространство переменных?

общее пространство -- цепочка прототипов. Чтобы всегда иметь к нему доступ используйте this в методах

protoquest 02.04.2016 13:24

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


Часовой пояс GMT +3, время: 11:34.