|
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 меняет свое значение. Может быть есть решение проблемы? Заранее благодарен |
а чем то self внутри мешать начало ?
|
модифицируйте функцию Class, так чтобы она это делала автоматом. Или я что-то не понял?
|
Цитата:
|
Цитата:
|
а какие пробемы ?
this будет указывать на класс, если ты боишся потерять this внутри метода, тогда сохраняй его в методе в самом начале.
test=class({
hello:function(){
var self=this;
setTimeout(function(){
//здесь this мы потеряли, на класс он больше не указывает
// зато доступен self !!!!
self.world("hello");
},1000) ;
},
world:function(text){
alert(text+"world")
}
})
|
надо посмотреть на обертку Class чтобы разобраться
а чем Вам эта обертка понравилась? |
Вот именно прописывать в каждом методе var self = this я совершенно не хочу. А придется это делать очень часто, т.к. постоянно работаю с jquery и другими фреймворками. Получается типа:
this.someAction = function() {};
this.method = function() {
this.someAnotherMethod({
onSuccess: function() {
this.someAction(); // не будет работать, т.к. this указывает не на объект, в котором лежит внешний метод.
self.someAction(); // раньше работало, а при использовании Class - нет.
}
});
};
|
Обертка вот:
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;
}
|
Цитата:
|
| Часовой пояс GMT +3, время: 08:05. |
|