Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Своенравный this (https://javascript.ru/forum/misc/55828-svoenravnyjj.html)

sexbot 16.05.2015 06:09

Своенравный 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?

sexbot 16.05.2015 06:11

C bind'ом например нельзя удалить обработчик (ну если созданную с помощью него функцию не запонить)

kostyanet 16.05.2015 06:17

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

С тех пор как я несколько раз напоролся на этот сук - так больше не делаю, гребись они конем эти объекты. Нарисовал приватных методов, вывел в интерфейс что надо - так все четко работает.

kostyanet 16.05.2015 06:21

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

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

и матка рвется. Наружный обж сам по себе, внутрений сам по себе, а вроде как обжи оба.

kostyanet 16.05.2015 06:25

Кстати да, а кто знает как сделать такой обж, наподобие тех, которые из ДОМа получаем и которые при любой передаче остаются live и ап ту дате?

Safort 16.05.2015 07:55

Цитата:

Сообщение от sexbot (Сообщение 371107)
Как вот эта проблема обходится в javascript?

В новом стандарте ES6 есть возможность использовать стрелочные функции со статичным this.

var test = {
  demo: () => {
    //тело функции
  }
}

sexbot 17.05.2015 04:30

У меня возникли сложности с примером типо этого. Дело в том что если производишь действия типа этого `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();

newjsser 17.05.2015 12:13

Цитата:

Сообщение от sexbot
Как вот эта проблема обходится в javascript?

А в чем проблема?

nerv_ 17.05.2015 12:27

Цитата:

Сообщение от Safort
В новом стандарте ES6 есть возможность использовать стрелочные функции со статичным this

при описании класса есть такая возможность?)

Safort 17.05.2015 12:48

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

newjsser 17.05.2015 13:04

Цитата:

Сообщение от Safort
про классы

А ты в курсе, что в Ъ (JS, smalltalk, ruby, Io, self etc) все есть объект, в том числе и класс? И как ты себе представляешь динамическую диспетчеризацию со своими детсадовскими стрелочными ф-циями?

Safort 17.05.2015 13:09

newjsser,
всё-всё, ты победил, я сливаюсь, только не оффтопь.

kostyanet 18.05.2015 08:33

Цитата:

Сообщение от newjsser
все есть объект, в том числе и класс?

Обычно объекты делаются из классов, а в Ъ как я понял могут быть варианты вплоть до наоборот?

Erolast 18.05.2015 14:26

Цитата:

Сообщение от nerv_ (Сообщение 371211)
при описании класса есть такая возможность?)

https://gist.github.com/jeffmo/054df782c05639da2adb

Babel уже поддерживает, но я бы юзал очень осторожно, ибо еще даже не драфт.

sexbot 18.05.2015 19:26

Очередной интерпретатор написанный на javascript. Изврат же. Прелесть javascript заключается в том что в любом браузере есть консоль в которой можно протестировать код, а с этими компилируемыми языками, отладка наверное уморительна

Safort 18.05.2015 21:36

sexbot,
Цитата:

Очередной интерпретатор написанный на javascript.
Цитата:

а с этими компилируемыми языками, отладка наверное уморительна
Ты уж определись.

sexbot,
Цитата:

Очередной интерпретатор написанный на javascript. Изврат же.
Ты просто не разобрался в вопросе. Это не интерпретатор, а транслятор(транспайлер). Он преобразовывает новые версии JS в более старую. А с отладкой кода в Babel'е лично у меня никогда проблем не возникало.

kobezzza 18.05.2015 22:05

Цитата:

А с отладкой кода в Babel'е лично у меня никогда проблем не возникало.
Тем более Babel умеет сорсмапы, т.е. отлаживаться будет исходный код.

kostyanet 19.05.2015 06:02

Цитата:

Сообщение от Safort
Он преобразовывает новые версии JS в более старую

Типа делает из МС Офис 2013 - мс офис 2003 ?

Erolast 19.05.2015 10:02

Цитата:

Прелесть javascript
ECMAScript - это и есть javascript, лол. Его официальное название.

Цитата:

заключается в том что в любом браузере есть консоль в которой можно протестировать код
И в ФФ, и в хроме большинство фич ES6 уже поддерживается и я спокойно тесчу их в консоли.

Цитата:

А с отладкой кода в Babel'е лично у меня никогда проблем не возникало.
У меня тоже. Даже без карт выходной код прекрасно читаем (хотя и в этом нужды как-то не возникало).

Erolast 19.05.2015 10:04

Цитата:

Типа делает из МС Офис 2013 - мс офис 2003 ?
Позволяет МС Офису 2013 запускаться на ХП.


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