Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.11.2012, 19:05
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

self = this в обертке Class
Здравствуйте!
В этом (Объекты, прототипы и циклы) топике мне посоватовали использовать обертку Class для организации объектов.

Мне она понравилась. Очень удобно.

Есть одно НО:
Раньше я всегда в начале класса писал var self = this и внутри всех методов использовал self вместо this.

Например:
function A(o) {
    var self = this;

    var init = function() {
        self.setOptions(o);
    };

    this.setOptions = function(o) {
        self.options = o;
    };

    init();
}

var a = new A({test: "foo"});
var b = new A({test: "bar"});

console.log(a.options); // foo
console.log(b.options); // bar


Теперь я начал использовать обертку Class, которую мне посоветовали.
Возникла проблема, которую я затрудняюсь решить:
var A = new Class(function() {
    var self = this;

    this.__construct__ = function(o) {
        self.setOptions(o);
    };

    this.setOptions = function(o) {
        self.options = o;
    };
});

var a = new A({test: "foo"});
var b = new A({test: "bar"});

console.log(a.options); // bar  (должно быть "foo"!)
console.log(b.options); // bar


Скорее всего я делаю что-то неправильно. Использовать this внутри методов неудобно, т.к. активно используется jquery и различные callback's, внутри которых this меняет свое значение.

Может быть есть решение проблемы? Заранее благодарен
Ответить с цитированием
  #2 (permalink)  
Старый 14.11.2012, 19:21
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

а чем то self внутри мешать начало ?
Ответить с цитированием
  #3 (permalink)  
Старый 14.11.2012, 19:24
Интересующийся
Отправить личное сообщение для OctoberTide Посмотреть профиль Найти все сообщения от OctoberTide
 
Регистрация: 22.09.2012
Сообщений: 25

модифицируйте функцию Class, так чтобы она это делала автоматом. Или я что-то не понял?
Ответить с цитированием
  #4 (permalink)  
Старый 14.11.2012, 19:26
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

Цитата:
а чем то self внутри мешать начало ?
Не очень понял, что имелось в виду
Ответить с цитированием
  #5 (permalink)  
Старый 14.11.2012, 19:28
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от bFree
Не очень понял, что имелось в виду
т.е. в чём вопрос топика? похоже, что не я один не понял, в чём заключается проблема
Ответить с цитированием
  #6 (permalink)  
Старый 14.11.2012, 19:39
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

а какие пробемы ?
this будет указывать на класс, если ты боишся потерять this внутри метода, тогда сохраняй его в методе в самом начале.

test=class({
    hello:function(){
        var self=this;

        setTimeout(function(){      
                //здесь this мы потеряли, на класс он больше не указывает
                // зато доступен self !!!!
                self.world("hello");
        },1000) ;
    },

    world:function(text){
          alert(text+"world")
    }

})
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 14.11.2012 в 19:43.
Ответить с цитированием
  #7 (permalink)  
Старый 14.11.2012, 19:46
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

надо посмотреть на обертку Class чтобы разобраться
а чем Вам эта обертка понравилась?

Последний раз редактировалось vadim5june, 14.11.2012 в 19:50.
Ответить с цитированием
  #8 (permalink)  
Старый 14.11.2012, 19:46
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

Вот именно прописывать в каждом методе var self = this я совершенно не хочу. А придется это делать очень часто, т.к. постоянно работаю с jquery и другими фреймворками. Получается типа:

this.someAction = function() {};

this.method = function() {
    this.someAnotherMethod({
        onSuccess: function() {
            this.someAction(); // не будет работать, т.к. this указывает не на объект, в котором лежит внешний метод.
            self.someAction(); // раньше работало, а при использовании Class - нет.
        }
    });
};
Ответить с цитированием
  #9 (permalink)  
Старый 14.11.2012, 19:49
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

Обертка вот:

function Class( a, b ) {
	var description = b || a,
		superClass = b ? a : null,
		overname = Class.overname || 'super',
		Constructor = (description.name)
			? eval( "(function " + description.name +
			"(){ if ( this.__construct__ )  return this.__construct__.apply( this, arguments )})" )
			: function () {
			if ( this.__construct__ )  return this.__construct__.apply( this, arguments )
		},
		Object = function Object() {
		};

	Object.prototype = superClass ? superClass.prototype : Class.prototype;
	description.prototype = new Object;
	Constructor.prototype = new description( Constructor, description.prototype );

	var obj = Constructor.prototype;
	for ( var key in obj ) {
		if ( obj.hasOwnProperty( key ) && obj[key] instanceof Function ) {
			var parentProperty = description.prototype[key];
			if ( parentProperty )
				(function ( originalMethod, parentMethod, key ) {
					obj[key] = function () {
						var bk = this[overname];
						this[overname] = parentMethod;
						var returns = originalMethod.apply( this, arguments );
						if ( bk ) this[overname] = bk;
						else delete this[overname];
						return returns;
					}
				})( obj[key], parentProperty, key )
		}
	}

	Constructor.create = function ( args ) {
		function Object() {
			if ( this.__construct__ )  return this.__construct__.apply( this, args )
		}

		Object.prototype = Constructor.prototype;
		return new Object
	};

	return Constructor;
}
Ответить с цитированием
  #10 (permalink)  
Старый 14.11.2012, 19:52
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от bFree
Обертка вот:
это maximaximus что писал-пусть сам с ней и разбирается
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17
Рандомный class или id fAmOus Элементы интерфейса 4 14.07.2012 14:28
Uncaught ReferenceError: Class is not defined igshul Javascript под браузер 3 24.04.2012 11:49
Заменить id на class klev2004 Общие вопросы Javascript 0 05.04.2012 16:03
Cannot instantiate non-existent class: DOMDocument Beton-Karton Events/DOM/Window 0 02.03.2011 12:01