Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прикреплённый контекст (https://javascript.ru/forum/misc/56151-prikrepljonnyjj-kontekst.html)

Sweet 01.06.2015 17:53

Прикреплённый контекст
 
Будет ли в js когда-нибудь такое:
class Foo {
  bar() {
    return this;
  }
}

let foo = new Foo;
let test = x => x();

test(foo.bar) == foo;

???
В стрелочных функциях же биндится текущий контекст, было бы здорово, если бы и методам класса экземпляр прикреплялся, не?

kostyanet 01.06.2015 18:17

"Мы к вам профессор вот по какому поводу." Расскажите народу что такое вы изобрели.

Sweet 01.06.2015 18:36

Цитата:

Сообщение от kostyanet
Расскажите народу что такое вы изобрели.

Я ничего не изобрел. Я спрашиваю, не знает ли кто, войдет ли это в спецификацию ECMAScript 6? Или может в ECMAScript 7? Или для js это принципиально ненужная фича?
Если в синтаксисе ES5, то я вот о чём:
var obj = {
    someText: "some text",
    func: function () {
        return this.someText;
    }
};

var func = obj.func;

obj.func() == "some text";
func() == undefined;

sexbot 01.06.2015 18:44

Эту забавную особенность JavaScript можно было бы назвать: "у вас this отклеился". По ходу ничего не изменится.


indeterm 01.06.2015 23:40

Цитата:

Сообщение от Sweet
я вот о чём:

Детский сад какой-то
var obj=function(){
    var someText="someText"
    return{
     someText: someText,
     func: function () {
        return someText;
    }
  }
}()
 
var func = obj.func;
alert([
 obj.func(),
 func()
])


var obj={
    someText: "some text",
}

obj.func=function () {
   return this.someText
}.bind(obj)
 
var func = obj.func;
 
alert([
 obj.func(),
 func()
])

// ::: [ 'some text', 'some text' ]
// ::: [ 'some text', 'some text' ]

indeterm 01.06.2015 23:44

Цитата:

Сообщение от sexbot
Эту забавную особенность JavaScript

Это не "забавная особенность", а неотъемлемое свойство всех ООП-языков, где есть настоящее ООП.

indeterm 02.06.2015 00:11

Цитата:

Сообщение от Sweet
Будет ли в js когда-нибудь такое:

Кстати, это и так есть
Foo=function(name) {
  this.name=name
  this.bar=function(){return this}.bind(this)
}
 
foo = new Foo("foo");
test =function(x){return x()}
 
console.log(test(foo.bar))
alert(test(foo.bar).name)
// ::: { name: 'foo', bar: [Function] }
// ::: foo

indeterm 02.06.2015 00:20

Цитата:

Сообщение от sexbot
назвать: "у вас this отклеился"

и да, кстати, неверная ассоциация. Он не может отклеиться, поскольку он ни к чему никогда не приклеен.

Sweet 02.06.2015 00:28

Цитата:

Сообщение от indeterm
Детский сад какой-то

Вау, НИЧЁСИ! И так можно?!:lol: Если серьёзно, indeterm, зачем ты написал эту хуетуерунду? Это ж совсем не соответствует тому, о чём я говорю:) Я просто не хочу каждый раз писать .bind(context). Потому что это глупо.
Когда используешь js, постоянно используешь callback-и. И удобно ведь передавать функции—члены класса. Странно, что эту возможность игнорят.

Цитата:

Сообщение от indeterm
неотъемлемое свойство всех ООП-языков, где есть настоящее ООП.

Например, python - очень близок к тому, к чему идет js. И там всё ок (полностью соответствует изначальному примеру):
Код:

class Foo:
        def bar(self):
                return self

foo = Foo()
test = lambda x: x()

test(foo.bar) == foo  # тут всё ок


indeterm 02.06.2015 00:33

Цитата:

Сообщение от Sweet
Например, python - очень близок к тому

Пистон близок к говну. Если JS идет туда,мне очень жаль.
Цитата:

Сообщение от Sweet
Я просто не хочу каждый раз писать .bind(context)

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

indeterm 02.06.2015 00:43

Цитата:

Сообщение от Sweet
Например, python

Кстати, забавно наблюдать, как фатальный недостаток питона выдается за фичу. Суть твоего куска в том, что в пистоне лямбды не могут динамически связываться с контекстом, поэтому там все (на радость быдлу) выглядит просто как 3 копейки. А цена этому -- отсутствие полноценной динамической диспетчеризации.

Еще более удивительно, как такое статик-говно умудряется быть настолько тормозным. Такие кастрированные языки обычно хорошо компилируются. Хоть они и памяти отжирают немеряно, с перформансом должно быть ок, в теории. Воистину, феноменальный язык.

Sweet 02.06.2015 00:49

Цитата:

Сообщение от indeterm
Пистон близок к говну. Если JS идет туда,мне очень жаль.

Можешь начинать жалеть, потому что это факт:)
Самом деле, js никуда не идет. Потому что идти некуда. Я вот смотрю на всякие web components, ES6, и не вижу в этом смысла.. Тленно всё в web-е:D

Sweet 02.06.2015 01:20

Цитата:

Сообщение от indeterm
Подобное связывание, если оно наблюдается часто, явный признак быдлокода.

Обоснуй

indeterm 02.06.2015 01:30

Цитата:

Сообщение от Sweet
Обоснуй

Слишком долго. Сам поймешь, если врубишься. Попиши на чем-нибудь из смоллток/руби/селф/Io, дойдет может быть. Твое непонимание идет от непонимания семантики JS. от самых корней. Хз как тебе объяснить. Это вопрос не столько синтаксиса, сколько проектирования. почитай про динамическую диспетчеризацию, про позднее связывание.

Erolast 02.06.2015 15:46

Цитата:

Я спрашиваю, не знает ли кто, войдет ли это в спецификацию ECMAScript 6? Или может в ECMAScript 7? И
Ты хотел сказать, не планируется ли это к введению в ES6/ES7? Нет.

Для передачи метода объекта в качестве коллбека с автоматической привязкой контекста сейчас обсуждается специальный оператор - https://github.com/zenparsing/es-function-bind.

Sweet 02.06.2015 18:40

Erolast, спасибо, именно об этом и спрашивал. Полезная инфа.

indeterm 02.06.2015 19:20

Erolast,
Слышь, ходячая спецификация, ты хоть че-нибудь кроме чтения доков умеешь делать? Хоть одну программу написал в своей жизни? Начни с факториала, мля, чтоли. Лучше поздно, чем никогда,

kichSman 03.06.2015 00:44

Sweet,
Из ES2015, не?
class Point extends Base {
  constructor(x,y) {
    super();
    this[px] = x, this[py] = y;
    this.r = function() { return Math.sqrt(x*x + y*y); }
  }
  get x() { return this[px]; }
  get y() { return this[py]; }
  proto_r() { return Math.sqrt(this[px] * this[px] +
      this[py] * this[py]); }
  equals(p) { return this[px] === p[px] &&
      this[py] ===


На node.js уже можно через это


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