Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как получить внутри метода объект, на который этот


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

Код

    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 сплошные ретурны и куча функций...

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

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



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)