現在,如果你再打電話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