Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.05.2015, 06:09
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

Своенравный this
var test = {
    demo: function() {
        console.log(this);
    }
}
test.demo();    // logs the "test" object
var test2 = test.demo;
test2();        // logs "DOMWindow"
test.demo.apply("Cheese"); // logs "String"

o={x: 42, test: function() { console.log(this.x); }}
document.body.onclick = o.test; // undefined печатает
document.body.onclick = o.test.bind(o); // а так работает


Как вот эта проблема обходится в javascript?
Ответить с цитированием
  #2 (permalink)  
Старый 16.05.2015, 06:11
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

C bind'ом например нельзя удалить обработчик (ну если созданную с помощью него функцию не запонить)
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2015, 06:17
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Она не обходится, просто загоняют внутырь this покороче, типа _=this в конструкторе и капец.

С тех пор как я несколько раз напоролся на этот сук - так больше не делаю, гребись они конем эти объекты. Нарисовал приватных методов, вывел в интерфейс что надо - так все четко работает.
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2015, 06:21
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Но там тогда есть своя подстава. В js же нельзя явно определить реф, он там сам себе кумекает как хочет, то рефит то не рефит. Разбираться с этим киселем все некогда, в общем

var func = function(){
   var inner_obj = {one:1};
   /* blah-blah */
   return {
     outer_obj:inner_obj;
   }
};

и матка рвется. Наружный обж сам по себе, внутрений сам по себе, а вроде как обжи оба.
Ответить с цитированием
  #5 (permalink)  
Старый 16.05.2015, 06:25
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Кстати да, а кто знает как сделать такой обж, наподобие тех, которые из ДОМа получаем и которые при любой передаче остаются live и ап ту дате?
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2015, 07:55
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Сообщение от sexbot Посмотреть сообщение
Как вот эта проблема обходится в javascript?
В новом стандарте ES6 есть возможность использовать стрелочные функции со статичным this.

var test = {
  demo: () => {
    //тело функции
  }
}
Ответить с цитированием
  #7 (permalink)  
Старый 17.05.2015, 04:30
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

У меня возникли сложности с примером типо этого. Дело в том что если производишь действия типа этого `test = obj.test`, то при вызове test this ссылается уже на window, так же и у меня было когда обработчик пихал в массив

function Signal(context) {
  var self = this
    , callbacks = [];

  self.add = function(callback) {
    if (-1 == callbacks.indexOf(callback)) {
      callbacks.push(callback);
    } else {
      // throw Exception?
    }

    console.log(callbacks);
  };

  self.remove = function(callback) {
    var index = callbacks.indexOf(callback);

    if (index != -1) {
      callbacks.splice(index, 1);
    } else {
      // throw Exception?
    }

    console.log(callbacks);
  };

  self.removeAll = function() {
    callbacks = [];
  };

  self.emit = function() {
    for (var i = 0, len = callbacks.length; i < len; ++i) {
      callbacks[i].apply(context, arguments);
    }
  };
}

function Controller() {
  var self = this;
  
  var model = {
    value: 'foo',
    changed: new Signal(self),

    change: function(value) {
      if (model.value != value) {
        model.value = value;
        model.changed.emit();
      }
    }
  };

  var view = {
    informChange: function(val) {
      alert("New value of the model is " + val);
    }
  };

  model.changed.add(function() {
    view.informChange(model.value);
  });

  self.run = function() {
    setTimeout(model.change, 3000, 42);
  };
}

var controller = new Controller();
controller.run();
Ответить с цитированием
  #8 (permalink)  
Старый 17.05.2015, 12:13
Новичок на форуме
Посмотреть профиль Найти все сообщения от newjsser
 
Регистрация: 16.05.2015
Сообщений: 3

Сообщение от sexbot
Как вот эта проблема обходится в javascript?
А в чем проблема?
Ответить с цитированием
  #9 (permalink)  
Старый 17.05.2015, 12:27
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Safort
В новом стандарте ES6 есть возможность использовать стрелочные функции со статичным this
при описании класса есть такая возможность?)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #10 (permalink)  
Старый 17.05.2015, 12:48
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

nerv_,
нуу.. автор про классы ничего не говорил) А вообще, на сколько я знаю, такое должно появиться в ES7.
Ответить с цитированием
Ответ



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

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