Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Аналог bind из javascript (http://www.flasher.ru/forum/showthread.php?t=211820)

bushstas 14.11.2015 19:11

Аналог bind из javascript
 
Не пойму как сделать что-то подобное как в javascript

Код AS1/AS2:

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

Код AS1/AS2:

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

Метод load у класса Page
Код AS1/AS2:

public function load(callback) {
        DataLoader.load('getPageData', function() {
                callback();
        });
}

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

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

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

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

Код AS1/AS2:

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

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

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

Код AS1/AS2:

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

Цитата:

Сообщение от bushstas (Сообщение 1189000)
и почему так не делают??? кто это сказал?)))

Я. Как человек, занимающийся пграммированием на 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 наверное нет. Но тут классы, концепция не совсем такая все-таки.


Часовой пояс GMT +4, время: 03:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.