在JavaScript中,是什麼樣的區別:使用new運算符初始化單例JavaScript對象?
var singleton = function(){ ... }
和
var singleton = new function(){ ... }
?
如crockford(http://www.crockford.com/javascript/private.html)所述的聲明特權函數僅適用於後者。
在JavaScript中,是什麼樣的區別:使用new運算符初始化單例JavaScript對象?
var singleton = function(){ ... }
和
var singleton = new function(){ ... }
?
如crockford(http://www.crockford.com/javascript/private.html)所述的聲明特權函數僅適用於後者。
的區別主要是,在你的第二個例子,你正在使用的函數表達式爲Constructor,該new
操作將導致自動執行的功能,該功能內this
值指的是新創建的對象。
如果您沒有從該函數返回任何東西(或者您不返回非原始值),則this
值將被返回並分配給您的singleton
變量。
特權方法也可以在你的第二個例子中,一個常見的模式是使用immediately invoked function expression,創建closure其中私人成員都可以訪問,那麼你可以返回包含您公共API,如對象:
var singleton = (function() {
var privateVar = 1;
function privateMethod() {/*...*/}
return { // public API
publicMethod: function() {
// private members are available here
}
};
})();
很好的答案! +1 – 2010-02-12 04:28:18
你釘了它... – 2010-02-12 04:36:01
我認爲作爲由克羅克福德描述的特權功能應該是這樣的:
function Test() {
this.privileged = function() {
alert('apple');
}
function anonymous() {
alert('hello');
}
anonymous();
}
t = new Test; // hello
t.privileged(); // apple
// unlike the anonymous function, the privileged function can be accessed and
// modified after its declaration
t.privileged = function() {
alert('orange');
}
t.privileged(); // orange
這確實是一個特權功能,但不是一個單身人士。 – 2010-02-12 04:37:55
我很困惑becau你的問題的主體與標題中的要求不符。這有點不幸,因爲我真的很想知道如果你在單例中調用new時會發生什麼。主要是,當你做這樣的事時會發生什麼:var singleton = new(function(){return function(){};})(); 是否將新應用於該返回的函數? – Bob 2010-02-12 06:03:19
我想我們並不是說'單身'是同一件事。 至於你的問題,看看CMS的答案如下:「新的操作符會導致函數自動執行,並且該函數內的這個值將引用一個新創建的對象 如果你沒有返回任何東西(或者你不返回一個非原始值),這個值將被返回並分配給你的單例變量。「 – 2010-02-12 19:55:14
單例是對象的單個實例,它不需要新的操作符。至少,這就是有些人在引用JavaScript時使用的術語。如果你持有不同的定義,那很酷。至於我發佈的代碼片段:我試過了,失敗了。由於將函數包裝在括號中並追加()它會執行該函數並立即返回一個對象,因此新對象無法工作。 – Bob 2010-02-12 22:50:32