這取決於你的需求和相對錶現。 Javascript不是最安全的語言,對於會員的可見性並不強。傳統上,您可以在Javascript類型中擁有「私有」,「公共」特權「和」公共「可見性。
可以使用聲明的私人和公共特權的成員:
function FooClass()
{
var privateVar = 1;
function privateFn()
{
return privateVar; // etc...
}
this.publicVar = 2;
this.publicFn = function()
{
return privateFn();
}
}
本示例使用功能關閉,它由一個函數聲明,其包括從其中函數定義的範圍的值。當成員可見性是必要的時候這是可以接受的,但可能導致開銷。由於JavaScript解釋器引用了外部作用域中的變量或函數,因此無法爲每個實例重用privateFn或publicFn定義。結果,FooClass的每個實例都會爲privateFn和publicFn提供額外的存儲空間。如果該類型使用頻繁或適度,則性能損失可忽略不計。如果該類型在頁面中經常使用,或者如果頁面更多的是「AJAX」樣式,由於頁面未被卸載,內存不會頻繁釋放,那麼懲罰就會更加明顯。
另一種方法是使用原型成員。這些都是沒有特權的公衆成員。由於Javascript並不是完全類型安全的,並且在加載後相對容易修改,因此鍵入安全性和成員可見性對於控制對內部類型的訪問來說並不可靠。出於性能原因,一些框架(如ASP.NET Ajax)使用成員命名來推斷可見性規則。例如,在ASP.NET AJAX同類型可能看起來像:
function FooClass2()
{
this._privateVar = 1;
this.publicVar = 2;
}
FooClass2.prototype =
{
_privateFn : function()
{
return this._privateVar;
},
publicFn : function()
{
return this._privateFn();
}
}
FooClass2.registerClass("FooClass2");
在這種情況下,私人範圍的成員是名存實亡的「_」前綴被認爲是指一個私有成員變量私有。它具有防止成員真正私有的缺點,但是允許內存修補對象的好處。另一個主要的好處是所有的函數都是由解釋器和引擎創建的,並且一遍又一遍地重複使用這個類型。即使函數引用本身相同,「this」關鍵字也會引用該類型的實例。在行動中看到的差別
一種方法是用兩種類型試試這個(如果你沒有ASP.NET AJAX,可以忽略FooClass2的最後一行調用的registerClass())
var fooA = new FooClass(), fooB = new FooClass();
alert(fooA.publicFn===fooB.publicFn); // false
var foo2A = new FooClass2(), foo2B = new FooClass2();
alert(foo2A.publicFn===foo2B.publicFn); // true
因此,它是一個類型安全和成員知名度vs.性能和在內存中修補的能力
你FooClass例如不正確。 new的語義是有效的:「var foo = {}; foo .__ proto__ = FooClass.prototype; var temp = FooClass.call(temp); if(IsObject(temp))foo = temp;」。這意味着在你的例子中,foo將是新對象「{reallypublicfn:function(){...}}」,所以它不會有FooClass原型或publicfn函數 – olliej 2009-07-25 11:15:23