Просмотр полной версии : Аналог bind из javascript
bushstas
14.11.2015, 19:11
Не пойму как сделать что-то подобное как в javascript
someObject.someMethod((function() {
this.doSomething();
}).bind(this));
знаю существуют apply и call но ведь они вызывают функцию сразу
Опишите, что вы хотите сделать на человекопонятном языке
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;
}
Я советую прочитать вам про событийную модель.
И стараться не использовать большое кол-во анонимных функций, как в js, это тот путь, который создаст вам больше проблем, чем принесет пользы.
caseyryan
14.11.2015, 20:17
В as3 так не делают. Здесь есть события. Создаем кастомное событие, посылаем его из нужного объекта, и где необходимо подписываем к этом объекту слушатель данного события. Это и создаст необходимый контекст.
Хотя можно и в apply / call толкнуть вторым аргументом, если сильно надо)
bushstas
14.11.2015, 20:28
ну так и в JS есть кастомные события, хотелось бы без них, что нет бинда понятно, и почему так не делают??? кто это сказал?)))
Добавлено через 15 минут
Кастомные события только сцена может диспатчить? Или на что-то еще можно их повесить?
и почему так не делают??? кто это сказал?)))
Делать то можно, но делегирование было актуально во время 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 работают сами по себе, т.е. тут он просто не нужен.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.