Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   self = this в обертке Class (https://javascript.ru/forum/misc/33228-self-%3D-v-obertke-class.html)

bFree 14.11.2012 19:05

self = this в обертке Class
 
Здравствуйте!
В этом (http://javascript.ru/forum/misc/3215...y-i-cikly.html) топике мне посоватовали использовать обертку 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 меняет свое значение.

Может быть есть решение проблемы? Заранее благодарен

melky 14.11.2012 19:21

а чем то self внутри мешать начало ?

OctoberTide 14.11.2012 19:24

модифицируйте функцию Class, так чтобы она это делала автоматом. Или я что-то не понял?

bFree 14.11.2012 19:26

Цитата:

а чем то self внутри мешать начало ?
Не очень понял, что имелось в виду

melky 14.11.2012 19:28

Цитата:

Сообщение от bFree
Не очень понял, что имелось в виду

т.е. в чём вопрос топика? похоже, что не я один не понял, в чём заключается проблема

DjDiablo 14.11.2012 19:39

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

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

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

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

})

vadim5june 14.11.2012 19:46

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

bFree 14.11.2012 19:46

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

this.someAction = function() {};

this.method = function() {
    this.someAnotherMethod({
        onSuccess: function() {
            this.someAction(); // не будет работать, т.к. this указывает не на объект, в котором лежит внешний метод.
            self.someAction(); // раньше работало, а при использовании Class - нет.
        }
    });
};

bFree 14.11.2012 19:49

Обертка вот:

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;
}

vadim5june 14.11.2012 19:52

Цитата:

Сообщение от bFree
Обертка вот:

это maximaximus что писал-пусть сам с ней и разбирается


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