javascript new keyword - 返回在内部匿名函数内创建的新对象

时间:2012-10-12 03:22:22

标签: javascript

我正在阅读一本关于DOM脚本的书,当他们谈论Ajax时,书中会出现以下函数。

function getHTTPObject() {

    if(typeof XMLHTTPRequest == "undefined")
        XMLHTTPRequest = function() {
           try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
           catch(e) {}

           //several more fall through try/catch blocks attempting 
           //to create different XMLHTTP objects. 
           //If none succeed...

           return false;
        }

     return new XMLHTTPRequest();
}

如果在尝试在分配给XMLHTTPRequest的内部匿名函数中创建ActiveXObject时在try / catch块中使用new关键字,为什么在getHTTPObject结束时返回XMLHTTPRequest的结果时再次使用new关键字()?

好像它正在返回一个新的新对象。

修改

我广泛地理解代码的目的是什么,检查XMLHTTPRequest构造函数是否存在,如果没有,则定义尝试生成XMLHTTP ActiveXObjects的构造函数。我到目前为止和你在一起。

假设XMLHTTPRequest未定义。

XMLHTTPRequest被赋予内部函数构造函数。

然后在getHTTPRequest的底部调用XMLHTTPRequest。

在XMLHTTPRequest中,创建一个新的ActiveXObject并将其返回给调用者,在本例中为getHTTPObject。现在,getHTTPObject又将此对象返回给它的调用者。但同样,为什么这一行:

return new XMLHTTPRequest() 
如果新的(即对象实例化)已经出现在XMLHTTPRequest()的定义/范围内的try块的代码中,那么

需要新的吗?为什么不简单:

return XMLHTTPRequest()

感谢大家的回答。很可能,甚至可能,我对JS构造函数语法没有足够的掌握,这就是我在这里绊倒的。

5 个答案:

答案 0 :(得分:1)

立即返回并退出代码块。只有其中一个回报会被击中。

答案 1 :(得分:1)

您提到的try块仅在if条件

时执行
if(typeof XMLHTTPRequest == "undefined")

保持良好。如果没有,它会直接到达getHTTPObject()方法末尾的return语句,然后返回新的XMLHTTPRequest对象。

因此,返回新的ActiveXObject或新的XMLHTTPRequest

答案 2 :(得分:1)

在外部构造函数之前不调用内部构造函数。 相反,XMLHTTPRequest函数首先定义,如果它不存在,然后作为构造函数调用。

它首先检查XMLHTTPRequest是否存在(原始的或者前一次调用中的一个。如果存在,则将其称为构造函数。如果不存在,则首先创建它。

这里的一个技巧是,如果构造函数返回一个对象,new对象不是已分配的对象,而是返回的对象。通常,这会导致立即进行垃圾回收。聪明的翻译可能意识到它根本不需要分配。这是新创建的构造函数所做的 - 返回一个不同的对象。 (见http://www.gibdon.com/2008/08/javascript-constructor-return-value.html

创建的XMLHTTPRequest取代了浏览器的XMLHTTPRequest。浏览器自己的XMLHTTPRequest构造函数不能作为函数调用,需要作为构造函数调用,这就是为什么新创建的对象也必须作为构造函数调用。


请注意,这通常是库或工具包(例如jQuery)的工作,以选择正确的AJAX对象。

答案 3 :(得分:1)

你误解了代码。

> function getHTTPObject() {
> 
>     if(typeof XMLHTTPRequest == "undefined")
>         XMLHTTPRequest = function() {

如果标识符XMLHTTPRequest未定义,请指定以下函数。

>            try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
>            catch(e) {}
> 
>            //several more fall through try/catch blocks attempting 
>            //to create different XMLHTTP objects. 
>            //If none succeed...
> 
>            return false;
>         }

现在调用XMLHttpRequest,它将是主机提供的功能或上面指定的功能。

>      return new XMLHTTPRequest(); }

以上假设如果标识符XMLHttpRequest解析为undefined以外的其他内容,则它是可调用的并返回XMLHttpRequest实例。

答案 4 :(得分:0)

JavaScript允许从其构造函数返回另一个对象;构造函数在这里定义:

XMLHTTPRequest = function() {
       try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}

new ActiveXObject("Msxml2.XMLHTTP.6.0")成功的情况下,生成的对象将返回给作为构造函数调用XMLHTTPRequest的任何调用者。

    return false;

此语句将返回类型为XMLHTTPRequest的空对象,因为false本身不是对象。

最后getHTTPObject()需要返回一个对象,而不仅仅是构造函数,这就是你最后看到return new XMLHTTPRequest();的原因。

另请参阅ECMAScript Language Specification中的此行为的干版本。