Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить внутри метода объект, на который этот, метод повешен? 
:(
    Опции темы
Ghirik
Дата 19.6.2008, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Есть кусок кода, где создается обработчик и вешается методом на объект.
Вот примерная вырезка, по которой можно понять, как это происходит.

Код

    if (typeof p.parent != 'undefined' && p.parent == 'on') {
        if(!o.id) { o.id = 'anima' + animaCounter };
        script = document.createElement('script');
        script.type = 'text/javascript';
        var text = 'document.getElementById("' + o.id + '").anima = function() {
......
......
......

 .......
......
......

        script.text = text;
        document.body.appendChild(script);



Во-первых, подозреваю, что такой подход не очень правильный, если кто прокоментирует его неправильность, буду очень признателен.
Во-вторых, мне нужно иметь доступ внутри метода к объекту, на котором он висит, а не к вызывающему этот метод. Всё остальное есть... доступ к вызывающему объекту не нужен, он вызывает, и про него забыли...

Вы полнить создание метода внутри функции, без вывода в тело документа я не могу. Слишком много условий при формировании кода обработчика. Во время выполнения это всё испортит.

Это происходит в довольно большой функции, около 7 сжатых кб. Подход к написанию кода этой функции был выдержан с минимальным созданием дополнительных методов и объектов. Ни где не применялся прототип, наследование методов и пр., потому, не очень хочется его использовать. Да в общем то, я и не знаю, можно ли его использовать ни чего не глобализуя. Глобализовать не хочется, написал столько кода, создав всего одну глобальную переменную  smile (и то, могу спрятать её внутрь). Можно ли как то применить call(), и получить ссылку на обработчик. Не смог разобраться  bind(), пишется следующее:

Цитата

метод call выполняет функции немедленно. Вместо того чтобы предоставить функции ссылку на обработчик onclick, мы выдаем ей результат запущенной функции. Чтобы реально решить эту проблему, нам необходимо воспользоваться другой функцией JavaScript.

Метод .bind()

Одно простое добавление к объекту Function при помощи метода Prototype JavaScript оказывает весьма сильное влияние на возможность управления контекстом, в котором запускаются функциональные вызовы: метод bind выполняет те же функции, что и метод call, изменяя контекст, в котором работает функция. Разница лишь в том, что bind возвращает ссылку на функцию, которую можно будет использовать впоследствии, а не результат немедленного выполнения, которое выдает нам метод call.


И приводится примерно такой код
Код

var first_object = { num: 42 };
var second_object = { num: 24 };

function multiply() {
    return this.num;
};

Function.prototype.bind = function(obj) {
    var method = this;
    var temp = function() {
        return method.apply(obj);
    };
    return temp;
};

alert(multiply.bind(first_object)());
alert(multiply.bind(second_object)());


Всё работает, но найти подтверждения словам метод bind выполняет те же функции, что и метод call я не смог. Применить bind отдельно от apply не получается. И вообще, такое не нравится... smile сплошные ретурны и куча функций...

Мне то нужно, всего добраться до объекта!

Что то я многовато написал....




Это сообщение отредактировал(а) Ghirik - 19.6.2008, 22:47


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0419 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.