现在,如果你再打电话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;
所以,如果我理解正确的话,对A型“直接”功能将覆盖具有相同的名称前面的函数原型? – pimvdb 2011-03-22 21:02:56
@pimvdb否 - 将'getWindow'方法添加到实例对象本身(在上面的代码中为'a')。 'A.prototype.getWindow'方法没有被修改。然而,'a.getWindow'现在** **''.prototype.getWindow'方法,所以这个原型方法变得实例对象'a'无法访问。 – 2011-03-22 21:05:44
为什么我需要'()'在'返回'结束? – theateist 2011-03-24 13:50:51