2011-03-22 70 views
7

我看到很多,该函数返回不是结果,但函数。 下面的例子显示功能getWindow返回函数。为什么它不能只是返回变量“赢”?当我返回结果和何时功能? 谢谢。当函数返回结果,并在JavaScript中的函数

var A = function(){}; 
A.prototype= 
{ 
    getWindow : function() 
    { 
     var win = new B.window(); 
     return (
       this.getWindow = function() 
       { 
        return win; 
       })(); 

    } 
} 

回答

4

这个代码就相当于你的代码,但更容易理解:

A.prototype = { 
    getWindow: function() { 

     var win = new B.window(); 

     this.getWindow = function() { 
      return win; 
     }; 

     return win; 

    } 
} 

用法:

首先,创建一个实例:

var a = new A(); 

然后,呼getWindow

a.getWindow(); 

这里,调用A.prototypegetWindow方法。正如你可以在我的上面代码中看到,A.prototype.getWindow将创建一个new B.window()回报它,但是在两者之间,它也将创建实例对象本身在getWindow方法

现在,如果你再打电话getWindow

a.getWindow(); 

A.prototype.getWindow不再称为因为实例对象本身具有getWindow方法。此方法返回第一次调用getWindow方法时返回的相同“win”对象。


你的模式允许多个A实例使用相同的方法A.prototype.getWindow实例化自己的“双赢”目标。试想一下:

var a1 = new A, 
    a2 = new A, 
    a3 = new A; 

a1.getWindow(); // creates window W1 and returns it 
a2.getWindow(); // creates window W2 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 

a3.getWindow(); // creates window W3 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 
a3.getWindow(); // returns window W3 

这是一个非常有用的模式:)


更新:

这是你的代码:

return (this.getWindow = function() { 
    return win; 
})(); 

首先,让我们来看看在parens里面的表达式:

this.getWindow = function() { return win; } 

正如你所看到的,这是一个赋值表达式。一个匿名函数对象被分配给由this(实例对象)引用的对象的getWindow属性。

请注意,此函数返回win对象。

该赋值表达式的结果是函数对象本身!这意味着parens中的值是函数对象。

现在,让我们来看看全貌:

return (the_function_object)(); 

我们可以去掉括号,因为我们不需要他们了:

return the_function_object(); 

正如你所看到的,在功能对象被调用,并且然后返回该函数的返回值。

如上所述,该函数返回win。因此,代码解析到此:

return win; 

那么你的代码的作用是:

首先,它分配给function() { return win; }this.getWindow

第二,它返回调用该函数的结果是win

我的代码产生相同的结果,但更容易理解:

this.getWindow = function() { 
    return win; 
}; 

return win; 
+0

所以,如果我理解正确的话,对A型“直接”功能将覆盖具有相同的名称前面的函数原型? – pimvdb 2011-03-22 21:02:56

+1

@pimvdb否 - 将'getWindow'方法添加到实例对象本身(在上面的代码中为'a')。 'A.prototype.getWindow'方法没有被修改。然而,'a.getWindow'现在** **''.prototype.getWindow'方法,所以这个原型方法变得实例对象'a'无法访问。 – 2011-03-22 21:05:44

+0

为什么我需要'()'在'返回'结束? – theateist 2011-03-24 13:50:51