Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.12.2011, 15:56
Новичок на форуме
Отправить личное сообщение для kasper_tpk Посмотреть профиль Найти все сообщения от kasper_tpk
 
Регистрация: 25.12.2011
Сообщений: 5

Видимость свойств объекта из внутренних функций
Сведу суть своей проблемы к обобщенно-наглядному примеру. Описываю я такой вот класс:
function myImages(){
    this.images = new Array();

    this.add_img = function(){
        /*
        тут идет кусок кода, где я добавляю в документ картинку,
        получаю ее node, и дальнейшие действия выполняю только
        по окончанию ее загрузки
        */
        node.onload = function(){
            /*
            тут кусок кода, где я из уже загруженной картинки считываю высоту,
            ширину и пр. необходимые мне параметры...
            И вот тут мне надо в this.images запушить объект с собранными свойствами.
            */
            this.images.push(obj)
        }
    }
}


Собственно вотъ.
Естественно this.images не сработает, потому что в этом месте this является ссылкой на саму картинку, а не на свойство объекта. Я понимаю почему я из этой функции не могу увидеть this.images, но я не понимаю как мне обойти это? Как мне подняться в область видимости на уровень выше? Или может я изначально не правильно построил структуру... может это можно вообще как-то по другому сделать...

ПыСы: пробовал функцию для onload описать на уровень выше, за пределами метода add_img - те же яйца.

ПыПыСы: заранее благодарю за помощь.
Ответить с цитированием
  #2 (permalink)  
Старый 25.12.2011, 16:47
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

function myImages(){
    var self = this;
    this.images = new Array();

    this.add_img = function(){
        /*
        тут идет кусок кода, где я добавляю в документ картинку,
        получаю ее node, и дальнейшие действия выполняю только
        по окончанию ее загрузки
        */
        node.onload = function(){
            /*
            тут кусок кода, где я из уже загруженной картинки считываю высоту,
            ширину и пр. необходимые мне параметры...
            И вот тут мне надо в this.images запушить объект с собранными свойствами.
            */
            self.images.push(obj)
        }
    }
}
Ответить с цитированием
  #3 (permalink)  
Старый 25.12.2011, 17:03
Новичок на форуме
Отправить личное сообщение для kasper_tpk Посмотреть профиль Найти все сообщения от kasper_tpk
 
Регистрация: 25.12.2011
Сообщений: 5

спасибо, но этот вариант я уже рассматривал. Проблема в том, что в таком случае после применения к объекту метода add_img его свойство images останется неизменным, т.к. значение мы записал в переменную, а не в свойство. Получается, что self подходит для считывания this внутри анонимных функций, но не для изменения.
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2011, 17:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

kasper_tpk,
Вариант ... кнопку тест нажать после загрузки картинки ... покажет ширину
<!DOCTYPE html>
<html >
<head>
  <title></title>
</head>

<body>
 <script  type="text/javascript">
  function myImages(){
    this.images = new Array();

    this.add_img = function(){
        /*
        тут идет кусок кода, где я добавляю в документ картинку,
        получаю ее node, и дальнейшие действия выполняю только
        по окончанию ее загрузки
        */
        var node = new Image
        document.body.appendChild(node)
        node.onload = function(arr){
            /*
            тут кусок кода, где я из уже загруженной картинки считываю высоту,
            ширину и пр. необходимые мне параметры...
            И вот тут мне надо в this.images запушить объект с собранными свойствами.
            */
            return function () {
            obj = this.width
            arr.push(obj)
                }

        }(this.images)
        node.src = arguments[0];
    }
}
var a = new myImages();
a.add_img('http://javascript.ru/forum/images/ca_serenity/misc/logo.gif')
  </script>
<input type="button" name="n" value="test"  onclick="alert(a.images[0]);"/>
</body>

</html>
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2011, 17:09
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Сообщение от kasper_tpk
спасибо, но этот вариант я уже рассматривал. Проблема в том, что в таком случае после применения к объекту метода add_img его свойство images останется неизменным, т.к. значение мы записал в переменную, а не в свойство. Получается, что self подходит для считывания this внутри анонимных функций, но не для изменения.
Приведите пример
Ответить с цитированием
  #6 (permalink)  
Старый 25.12.2011, 17:15
Новичок на форуме
Отправить личное сообщение для kasper_tpk Посмотреть профиль Найти все сообщения от kasper_tpk
 
Регистрация: 25.12.2011
Сообщений: 5

Нашел решение. Вроде как работает
http://habrahabr.ru/blogs/javascript/103760/
Ответить с цитированием
  #7 (permalink)  
Старый 25.12.2011, 17:23
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Так вы всё таки покажите в каком случае не подходит self?
Ответить с цитированием
  #8 (permalink)  
Старый 25.12.2011, 17:27
Новичок на форуме
Отправить личное сообщение для kasper_tpk Посмотреть профиль Найти все сообщения от kasper_tpk
 
Регистрация: 25.12.2011
Сообщений: 5

Цитата:
Приведите пример
var a = new myImages();
alert(a.images); //Первая проверка
a.add_img();
alert(a.images); //Вторая проверка


В обеих случая получим одно и то же значение.
Ответить с цитированием
  #9 (permalink)  
Старый 25.12.2011, 17:32
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от kasper_tpk
Проблема в том, что в таком случае после применения к объекту метода add_img его свойство images останется неизменным, т.к. значение мы записал в переменную, а не в свойство. Получается, что self подходит для считывания this внутри анонимных функций, но не для изменения.
Бред. self будет ссылаться на тот же объект, что и this, поэтому любое изменение этого объекта отразится на них обоих.
(function(){
  alert('Checking a: ' + this.a);
  var self = this;
  (function(){
    alert('Checking a inside function with another this: ' + this.a);
    alert('Checking a of original object: ' + self.a);
    self.a = 42;
  }).call({a : 'some string'});
  alert('Checking a: ' + this.a);
}).call({a : 5})


Сообщение от kasper_tpk
В обеих случая получим одно и то же значение.
А с чего Вы взяли, что оно изменилось именно между этими проверками (если изменилось вообще)?
Ответить с цитированием
  #10 (permalink)  
Старый 25.12.2011, 17:33
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Вы уверены?
function myImages(){
    var self = this;
    this.images = new Array();

    this.add_img = function(count){
        self.images.push(count);
    }
}
var o = new myImages();
o.add_img(1);
alert(o.images);
o.add_img(2);
alert(o.images);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
получение значений свойств объекта bear9 Общие вопросы Javascript 3 01.12.2011 23:32
Как получить список пользовательских функций объекта window? Маэстро Events/DOM/Window 13 03.07.2010 13:20
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00
Не работает перебор свойств объекта BANick Общие вопросы Javascript 1 16.09.2008 22:46