【问题标题】:How to get the instance name of an object如何获取对象的实例名称
【发布时间】:2011-01-28 11:40:35
【问题描述】:

我使用下面的代码编写代码以在指定的时间间隔内查询 Web 方法。

现在在 this.Poll 函数中我要做的

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

而不是

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

因为 IE 在 setTimeout 之后丢失了 this 指针
所以我必须传递类的实例名称:

    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>

【问题讨论】:

    标签: javascript class polling webmethod


    【解决方案1】:

    松开this.Poll() 中的括号。您立即调用此函数,而不是在一个时间间隔之后。如果你松开括号,它会将一个函数而不是它的结果传递给setInterval,你不会有任何问题。

    setTimeout(this.Poll, this.Interval);
    

    否则你立即调用该函数,没有任何东西可以保存this指针,IE只会删除它。

    在固定变体中,this.Poll 将持有指向this 的指针,并且不会被删除。

    【讨论】:

    • 即使没有牙套,灾难也会发生。你使用 IE != 8 吗?
    • self J-P 发布那个技巧。如果这不起作用,那么在您调用 Start 之前,您的对象正在被 GC(或尚未创建)。所以,在调用Start() 之前确保objPoll 存在,并在objPoll = new cPoll("objPoll"); 之前尝试释放var
    • GC 是可能的,但是当我单击 Start 时它就在那里,因为 Start 是从实例调用的。如果它不存在,它就不会启动。
    【解决方案2】:

    我只是想说,这个自我技巧为我节省了 的头发拉扯。

    我没想过要创建这样的参考。这意味着具有点击事件的动态创建的元素可以调用我的类的正确实例。

    【讨论】:

      【解决方案3】:

      你也可以使用:

      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

      【讨论】:

        【解决方案4】:
        var self = this;
        this.tmo = setTimeout(function(){
             self.Poll();
        }, this.iInterval);
        

        【讨论】:

        • this = pointerToInstanceInMemory,因此,self = pointerToInstanceInMemory
        • @J-P:我的意思是创建一个指向空对象的别名意味着该别名也是空的......
        • this 不能在 JavaScript 中是 null。这是不可能的。
        • 为什么不呢?指针可以始终为空。显然是有可能的,至少在IE8中肯定是这样的
        • 我不明白这怎么可能。请让我知道什么代码使this === null ...
        【解决方案5】:

        我今天提供了一个类似问题的答案,在该问题中我从头开始创建了一个投票类。您可能想自己采用它。为了不重复,这里是一个链接到所述问题的链接:

        Poll the Server with Ajax and Dojo*

        * 尽管有标题,但我的解决方案同时提供了“香草”和 Dojo 风格。

        【讨论】:

          【解决方案6】:

          您可以使用这个方便的小包装器以给定的时间间隔(默认为 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();
          });
          

          【讨论】:

            【解决方案7】:

            我又问了一个问题,答案就在这里:

            JavaScript: List global variables in IE

            遍历全局变量并检查它是否等于“this”。

            【讨论】:

              猜你喜欢
              • 2019-07-08
              • 2014-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-05
              • 2016-09-03
              相关资源
              最近更新 更多