Как получить имя экземпляра объекта

Я использую приведенный ниже код для написания кода для запроса веб-метода в указанный интервал.

теперь в функции this.Poll я должен сделать

this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval);

вместо

this.tmo = setTimeout(this.Poll(), this.iInterval);

потому что IE теряет указатель this после setTimeout
Поэтому я должен передать классу его имя экземпляра:

    var objPoll = new cPoll("objPoll");


Как я могу получить имя экземпляра, не передавая его в качестве параметра?
Я хочу убрать его оттуда !

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Intervall-Test</title>
    <script type="text/javascript" language="javascript">


        function test()
        {
            alert("Test");
            test.tmo = setTimeout(test, 2000);

            test.Clear = function()
            {
                clearTimeout(test.tmo);
            }
        }




        function cPoll(strInstanceName)
        {
            this.strInstanceName = strInstanceName ;
            this.iInterval = 2000;
            this.tmo=null;
            this.cbFunction=null;

            this.Poll = function()
            {
                this.cbFunction();
                this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval);
            }

            this.Start = function(pCallBackFunction, iIntervalParameter)
            {


                if(this.tmo != null)
                    this.Stop();

                if(iIntervalParameter && iIntervalParameter > 0)
                    this.iInterval=iIntervalParameter;

                this.cbFunction=pCallBackFunction;
                if(this.cbFunction!=null)
                    this.Poll();
                else
                    alert("Invalid or no callback function specified");
            }

            this.Stop = function()
            {
                if(this.tmo != null)
                {
                    clearTimeout(this.tmo);
                    this.tmo=null;
                }
            }
        }


        function CallBackFunction()
        {
            alert("PollCallBack");
        }

        // test();
        // test.Clear();


        var objPoll = new cPoll("objPoll");
    </script>
</head>

<body>
<h1>Test</h1>

<input type="Button" value="Start polling" onclick="objPoll.Start(CallBackFunction,3000);" />
<input type="Button" value="Stop polling" onclick="objPoll.Stop();" />
</body>
</html>

person Stefan Steiger    schedule 17.03.2010    source источник


Ответы (7)


Раскройте скобки в this.Poll(). Вы вызываете эту функцию сразу, а не через промежуток времени. Если вы потеряете скобки, он передаст функцию, а не ее результат, в setInterval, и у вас не будет никаких проблем.

setTimeout(this.Poll, this.Interval);

В противном случае вы сразу же вызываете функцию, и указатель this больше не хранится, и IE просто удаляет его.

В фиксированном варианте this.Poll будет содержать указатель на this и не будет удален.

person vava    schedule 17.03.2010
comment
Катастрофа случается даже без брекетов. Вы используете IE != 8 ? - person Stefan Steiger; 17.03.2010
comment
Тогда проделайте этот трюк с self J-P. Если это не сработает, ваш объект подвергается сборке мусора (или не был создан) до того, как вы вызовете Start. Итак, убедитесь, что objPoll есть, прежде чем вызывать Start() и пытаться потерять var до objPoll = new cPoll("objPoll"); - person vava; 17.03.2010
comment
GC возможен, но он есть, когда я нажимаю Start, потому что Start вызывается из экземпляра. Если бы его не было, он бы не запустился. - person Stefan Steiger; 17.03.2010

Я просто хотел сказать, что этот трюк избавил меня от тонны таскания за волосы.

Я не догадался создать такую ​​ссылку. Это означает, что динамически создаваемые элементы с событиями по щелчку могут вызывать правильный экземпляр моего класса.

person user362720    schedule 09.06.2010

Вы также можете использовать:

i.e.

var name = findInstanceOf(cPoll);

function findInstanceOf(obj) {
    for (var v in window) {
        try {
            if (window[v] instanceof obj)
                return v;
        } catch(e) { }
    };
    return false;
}

Из http://www.liam-galvin.co.uk/2010/11/24/javascript-find-instance-name-of-an-object/#read

person Liam Galvin    schedule 24.11.2010

Сегодня я дал ответ на аналогичный вопрос, в котором я создал класс опроса с нуля. Вы можете принять его для себя. Чтобы не дублировать, вот ссылка на указанный вопрос:

Опросить сервер с помощью Ajax и Dojo *

* Несмотря на название, мое решение предлагает как «ванильный», так и стиль Dojo.

person Justin Johnson    schedule 17.03.2010

Вы можете использовать эту удобную маленькую оболочку для периодического выполнения функции с заданным интервалом (по умолчанию 1 секунда):

function tick(func, interval) {
    return (function() {
        if(func())
            setTimeout(arguments.callee, interval || 1000);
    })();
}

Функция повторяется до тех пор, пока не вернет false:

tick(function() {
   if(should stop) return false;
   do stuff
   return true;
});

Если функция является методом, сделайте замыкание, как показано

// inside your object
var me = this;
tick(function() {
   return me.doStuff();
});
person user187291    schedule 17.03.2010

Я задал другой вопрос, ответ здесь:

JavaScript: список глобальных переменных в IE

Итерация по глобальным переменным и проверка, равна ли она «этому».

person Stefan Steiger    schedule 17.03.2010

person    schedule
comment
this = pointerToInstanceInMemory, следовательно, self = pointerToInstanceInMemory - person James; 17.03.2010
comment
@ J-P: я имею в виду создание псевдонима, указывающего на объект, который имеет значение null, означает, что псевдоним также имеет значение null ... - person Stefan Steiger; 17.03.2010
comment
this не может быть null в JavaScript. Это невозможно. - person James; 17.03.2010
comment
Почему нет ? Указатель всегда может быть нулевым. Очевидно, это возможно, и, по крайней мере, это определенно есть в IE8. - person Stefan Steiger; 18.03.2010
comment
Я не понимаю, как это возможно. Пожалуйста, дайте мне знать, какой код делает this === null ... - person James; 19.03.2010