2011-08-05 32 views
5

最好的做法是什麼使用這些?Javascript字面與功能oop

var x = { a: 'a', eat: function() { }, ... } 

VS

var x = function() { var a = 'a'; this.eat = function() { }} 

上述需要啓動:

new x(); 

有人可以幫我解釋一下兩者的重要性,哪一個是最好的空中接力社區內選擇?任何智慧的話都會有所幫助。我也做了一些研究,但沒有出現。非常感激。

回答

4

基本的區別在於第一個版本公開變量'a',而第二個版本隱藏它。因此,除非您想要或需要客戶端代碼才能訪問x.a,否則第二個版本是首選。

第三種方法是使用原型。在這種情況下,在構造函數中的局部變量不會做你多好,所以如果eat()需要訪問a,那麼你會寫:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() { 
    // do stuff with this.a 
} 

在這種情況下,每個實例有一個新副本a,但只有eat的一個副本。缺點(如果你認爲它是)a可用於x實例的用戶。

+0

但是,第二個版本不允許使用[[prototype]](其中第一個*可以被平凡地轉換成) - 第二個方法每個'eat'都會因此成爲一個新的函數對象與一個新的界限[[範圍鏈]]。我通常更喜歡使用[[prototype]]。 – 2011-08-05 06:54:18

+0

是的,但他總是可以做 'var x =(function(){var a ='a'; return {eat:function(){}};}());' –

+0

你可以舉一個例子原型會是什麼樣子? –

3

第一個只創建一個對象,不能與new關鍵字一起使用。第二個包含一個局部變量a而不是像第一個那樣創建一個屬性。

功能常常被當成命名函數來代替匿名函數賦值給變量:

function x() { 
    this.a = 'a'; 
    this.eat = function() {}; 
} 

現在你可以使用它創建對象:

var y = new x(); 

爲對象的指定方法的另一種方式是把它放在原型中:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() {}; 
+0

實際上,「分配給變量的匿名函數」被稱爲函數表達式,並且相當常見。 –

+0

@Bradley Staples:不,*函數表達式*不是賦給變量*的* anonymus函數,匿名函數是函數表達式的一種形式,所以賦給變量*的*匿名函數是一種形式的*分配給變量*的函數表達式。雖然這很常見,但命名函數更常見。 – Guffa

2

通常它d依靠你想要得到的東西。請記住,JS沒有真正的類,它的基於原型的語言。運營商new頗具誤導性。

我會建議使用文字{}只要有可能。在例子中,你可以做這樣的:

var myconstr = function(param){ 
    var pr = 'some private var'; 
    return { 
     a : param, 
     get2a : function(){ return this.a; } 
    }; 
}; 

如果你想只有一個實例,你總是可以只定義後調用這個函數。

但是如果你想使用prototype,使用構造函數可能會更容易 - 但是,我仍然不會使用new運算符,也許用其他函數包裝它會更好。