最好的做法是什麼使用這些?Javascript字面與功能oop
var x = { a: 'a', eat: function() { }, ... }
VS
var x = function() { var a = 'a'; this.eat = function() { }}
上述需要啓動:
new x();
有人可以幫我解釋一下兩者的重要性,哪一個是最好的空中接力社區內選擇?任何智慧的話都會有所幫助。我也做了一些研究,但沒有出現。非常感激。
最好的做法是什麼使用這些?Javascript字面與功能oop
var x = { a: 'a', eat: function() { }, ... }
VS
var x = function() { var a = 'a'; this.eat = function() { }}
上述需要啓動:
new x();
有人可以幫我解釋一下兩者的重要性,哪一個是最好的空中接力社區內選擇?任何智慧的話都會有所幫助。我也做了一些研究,但沒有出現。非常感激。
基本的區別在於第一個版本公開變量'a',而第二個版本隱藏它。因此,除非您想要或需要客戶端代碼才能訪問x.a
,否則第二個版本是首選。
第三種方法是使用原型。在這種情況下,在構造函數中的局部變量不會做你多好,所以如果eat()
需要訪問a
,那麼你會寫:
function x() {
this.a = 'a';
}
x.prototype.eat = function() {
// do stuff with this.a
}
在這種情況下,每個實例有一個新副本a
,但只有eat
的一個副本。缺點(如果你認爲它是)a
可用於x
實例的用戶。
第一個只創建一個對象,不能與new
關鍵字一起使用。第二個包含一個局部變量a
而不是像第一個那樣創建一個屬性。
功能常常被當成命名函數來代替匿名函數賦值給變量:
function x() {
this.a = 'a';
this.eat = function() {};
}
現在你可以使用它創建對象:
var y = new x();
爲對象的指定方法的另一種方式是把它放在原型中:
function x() {
this.a = 'a';
}
x.prototype.eat = function() {};
實際上,「分配給變量的匿名函數」被稱爲函數表達式,並且相當常見。 –
@Bradley Staples:不,*函數表達式*不是賦給變量*的* anonymus函數,匿名函數是函數表達式的一種形式,所以賦給變量*的*匿名函數是一種形式的*分配給變量*的函數表達式。雖然這很常見,但命名函數更常見。 – Guffa
通常它d依靠你想要得到的東西。請記住,JS沒有真正的類,它的基於原型的語言。運營商new
頗具誤導性。
我會建議使用文字{}
只要有可能。在例子中,你可以做這樣的:
var myconstr = function(param){
var pr = 'some private var';
return {
a : param,
get2a : function(){ return this.a; }
};
};
如果你想只有一個實例,你總是可以只定義後調用這個函數。
但是如果你想使用prototype
,使用構造函數可能會更容易 - 但是,我仍然不會使用new運算符,也許用其他函數包裝它會更好。
但是,第二個版本不允許使用[[prototype]](其中第一個*可以被平凡地轉換成) - 第二個方法每個'eat'都會因此成爲一個新的函數對象與一個新的界限[[範圍鏈]]。我通常更喜歡使用[[prototype]]。 – 2011-08-05 06:54:18
是的,但他總是可以做 'var x =(function(){var a ='a'; return {eat:function(){}};}());' –
你可以舉一個例子原型會是什麼樣子? –