2010-02-12 160 views
1

在JavaScript中,是什麼樣的區別:使用new運算符初始化單例JavaScript對象?

var singleton = function(){ ... } 

var singleton = new function(){ ... } 

如crockford(http://www.crockford.com/javascript/private.html)所述的聲明特權函數僅適用於後者。

+0

我很困惑becau你的問題的主體與標題中的要求不符。這有點不幸,因爲我真的很想知道如果你在單例中調用new時會發生什麼。主要是,當你做這樣的事時會發生什麼:var singleton = new(function(){return function(){};})(); 是否將新應用於該返回的函數? – Bob 2010-02-12 06:03:19

+0

我想我們並不是說'單身'是同一件事。 至於你的問題,看看CMS的答案如下:「新的操作符會導致函數自動執行,並且該函數內的這個值將引用一個新創建的對象 如果你沒有返回任何東西(或者你不返回一個非原始值),這個值將被返回並分配給你的單例變量。「 – 2010-02-12 19:55:14

+0

單例是對象的單個實例,它不需要新的操作符。至少,這就是有些人在引用JavaScript時使用的術語。如果你持有不同的定義,那很酷。至於我發佈的代碼片段:我試過了,失敗了。由於將函數包裝在括號中並追加()它會執行該函數並立即返回一個對象,因此新對象無法工作。 – Bob 2010-02-12 22:50:32

回答

5

的區別主要是,在你的第二個例子,你正在使用的函數表達式爲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 
    } 
    }; 
})(); 
+0

很好的答案! +1 – 2010-02-12 04:28:18

+0

你釘了它... – 2010-02-12 04:36:01

0

我認爲作爲由克羅克福德描述的特權功能應該是這樣的:

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 
+1

這確實是一個特權功能,但不是一個單身人士。 – 2010-02-12 04:37:55