PDA

Просмотр полной версии : Аналог bind из javascript


bushstas
14.11.2015, 19:11
Не пойму как сделать что-то подобное как в javascript

someObject.someMethod((function() {
this.doSomething();
}).bind(this));

знаю существуют apply и call но ведь они вызывают функцию сразу

СлаваRa
14.11.2015, 19:26
Опишите, что вы хотите сделать на человекопонятном языке

bushstas
14.11.2015, 19:36
У меня есть класс Main, есть класс Page

у класса Main есть метод createView, в котором создается экземпляр класса Page, который должен загрузить необходимые для себя данные и выполнить полученный callback

private function createView(viewName:String):Component {
var view = new Page();
view.load(function() {
this.addChild(view, viewName);
});
return view;
}

Метод load у класса Page
public function load(callback) {
DataLoader.load('getPageData', function() {
callback();
});
}

так вот мне нужно чтобы внутри функции callback был нужный контекст, думается мне что нужно его передавать вторым аргументом и делать apply

Добавлено через 10 минут
Есть идея сделать что-то типа того:

Оба этих класса унаследованы от класса Component

Написать ему метод bind

protected function bind(callback) {
var self = this;
return function() {
callback.apply(self);
}
}

что-то типа того

и использовать

private function createView(viewName:String):Component {
var view = new Page();
var cb = this.bind(function() {
this.addChild(view, viewName);
});
view.load(cb);
return view;
}

СлаваRa
14.11.2015, 20:14
Я советую прочитать вам про событийную модель.
И стараться не использовать большое кол-во анонимных функций, как в js, это тот путь, который создаст вам больше проблем, чем принесет пользы.

caseyryan
14.11.2015, 20:17
В as3 так не делают. Здесь есть события. Создаем кастомное событие, посылаем его из нужного объекта, и где необходимо подписываем к этом объекту слушатель данного события. Это и создаст необходимый контекст.

Хотя можно и в apply / call толкнуть вторым аргументом, если сильно надо)

bushstas
14.11.2015, 20:28
ну так и в JS есть кастомные события, хотелось бы без них, что нет бинда понятно, и почему так не делают??? кто это сказал?)))

Добавлено через 15 минут
Кастомные события только сцена может диспатчить? Или на что-то еще можно их повесить?

udaaff
14.11.2015, 20:58
и почему так не делают??? кто это сказал?)))
Делать то можно, но делегирование было актуально во время as2, в as3 нет такой необходимости в контексте вашей задачи.

Кастомные события только сцена может диспатчить? Или на что-то еще можно их повесить?
Любой flash.events.EventDisplatcher может их диспатчить.

caseyryan
14.11.2015, 21:03
и почему так не делают??? кто это сказал?)))

Я. Как человек, занимающийся пграммированием на as3 уже 6 лет, постоянно пишуший свои и читающий чужие коды, говорю, что так не делают (или делают, но очень редко). Не потому, что это невозможно, а потому что это не удобно в as3 и необходимости делать именно так, нет.
Но, еще раз повторю, если очень хочется, то можно отправить в apply / call вторым аргументом. В чем проблема-то? Точного аналога JS'овского bind() в as3 не существует.

bushstas
14.11.2015, 21:10
никакой проблемы, просто хотел узнать есть ли что-то подходящее без использования костылей, все объяснили, спасибо, буду впихивать в свои представления об ООП события

PS хотя bind наверное и есть сам по себе костыль

caseyryan
14.11.2015, 21:13
PS хотя bind наверное и есть сам по себе костыль
В JS наверное нет. Но тут классы, концепция не совсем такая все-таки.

Zebestov
15.11.2015, 20:47
В javascript без bind() (или его имитации врукопашную) сейчас никуда. Но, из всего, что я видел (не претендую), он применяется для случаев, которые в AS3 работают сами по себе, т.е. тут он просто не нужен.