|
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, время: 15:48. |
|