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)

DjDiablo 14.11.2012 19:58

Видите ли мой друг.


всех кто не хочет прописывать self в каждой функции кидают в бездонную яму. Кстатии зачем в каждой ?
Прописывайте только там где сочтёте это нужным.

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

максимум что можно, это передавать self в параметре, каждой фнкции.

Просто смеритесь, вы обречены :D

bFree 14.11.2012 20:08

В итоге получается, что JS требует постоянного написания одинакового кода, который явно излишен. Печалька.

Если прописывать прямо в методах, то получаем дополнительный мусор в коде.

Кажется, этот вопрос решили в Coffeescript

melky 14.11.2012 21:02

Цитата:

Сообщение от bFree
А придется это делать очень часто, т.к. постоянно работаю с jquery и другими фреймворками.

в jQuery почти везде можно передать контекст исполнения для обработчика ($.ajax точно, как помню)

bFree 14.11.2012 21:53

Нет. Просто хочу, чтобы можно было в коллбеках использовать указатель на объект безо всяких .bind и других доп. конструкций.

Пример:
this.onClick = function() {
   // bla-bla-bla
}

this.bindEvent = function() {
   $("some element").on("click", function(e) {
       this.onClick(); // oh noooo!! тут this = объект jquery
       // чтобы работало, мне нужно перед аттачем евента сделать в методе var self = this и внутри юзать self.onClick
   }
}

А если таких методов у меня в классе много? Я не хочу в каждом таком месте писать одинаковую строчку.

bFree 14.11.2012 21:58

iMaxmaxmaximus, я тебя понял. Замыкания действительно нет и self хранить негде.

Очень-очень жаль. Не люблю раздувать код одинаковыми конструкциями..
В coffescript это решено на уровне синтаксиса:
Код:

onClick: () ->
  // bla-bla-bla

bindEvent: () ->
  $("some element").on "click" (e) => // => как раз позволяет передать this
    @onClick()

И из этого кофескрипт как раз соберет то, что я не хочу писать руками: var _this = this;

bFree 14.11.2012 22:08

Если функция задается через "=>", а не "->", то @ внутри нее будет указывать на тот объект, в котором объявлена эта ф-ция (если правильно выразился)

Получится такое:
this.bindEvent = function() {
   var self = this;
   $("some element").on("click", function(e) {
       self.onClick()
   }
}

DjDiablo 15.11.2012 01:11

bind штука хорошая.
Жаль неработает в ie 8 и более младших.
неработает в андроидах<4й версии
Походу iphone тоже не будет работать, как я понял bind нет даже в последнем safary mobile

я бы пока побрезговал пользоваться.

DjDiablo 15.11.2012 01:47

ну да, так можно попробывать :)

DjDiablo 15.11.2012 02:05

можно немного подругому вызывать попробывать, хотя кривовато конечно.

if (typeof Function.prototype.bind=="undefined"){
    Function.prototype.bind=function(self,func){
         return function(){
              func.apply(self,arguments);
         }  
    }
}

и юзать
$('#element').on('click', this.clickHandler.bind(this,this.clickHandler)) ;


масло маслянное получается,
но работать вроде должно

DjDiablo 15.11.2012 02:22

а как тебе вот такой прикол ? :D

Function.prototype.bind2=function(self){
          fun=this;
          return function(){
          	fun.apply(self,arguments)
          }
             
        } 
z=function(){ alert(this.x) }.bind2({x:100})
z();


в ие вроде пашет


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