2011-01-10 58 views
4
(function() { 
    function User() { 
     //some properties 
    } 

    //private fn 1 
    User.prototype._aPrivateFn = function() { 
     //private function defined just like a public function, 
     //for convetion underscore character is added 
    } 

    //private function type 2 
    //a closure 
    function _anotherPrivateFunction() { 
     // do something 
    } 

    //public function 
    User.prototype.APublicFunction = function() { 

     //call private fn1 
     this._aPrivateFn(); 

     //call private fn2 
     _anotherPrivateFunction(); 
    } 

    window.UserX = User; 
})(); 

//定義javascript對象的私有方法的兩種方法中哪一種更好,尤其是內存管理和性能方面。JavaScript對象的 - 私有方法:哪種方式更好

+0

極有可能依賴於瀏覽器。 – 2011-01-10 08:18:22

+0

可悲的是,使用第二種方法需要在範圍鏈中多走一步,因此(可能不明顯)較慢。但你有更多的控制權。 – 2011-01-10 10:34:43

回答

10

你的「私人功能#1」根本不是私人的。鑑於版本#2已關閉,因此只能通過User對象訪問。

通常沒有「更好」,但在這種情況下,在這種情況下,封閉函數完全隱藏在外部世界中(這顯然更好)。

還有傳言說封閉造成內存泄漏,這是錯誤的。閉包不會造成內存泄漏,但程序員確實/可以。你的例子在這裏完全沒問題。

要擁有私有方法,您應該使用幾乎確切的模式。

var myObject = function() { 
    // privates 
    var a = 5, 
     b = 10, 
     c = a, 
     public = {}; 

    public.getA = function() { 
     return a; 
    }; 
    public.setA = function(v) { 
     a = v; 
    }; 

    function privateOne() { 
    } 

    return public; 
}; 
4

創建關閉是更好,如果你絕對必須(或希望)隱藏來自外部世界的功能。

添加方法的原型是更好,如果你在乎:

  1. 內存,因爲那時所有 實例將共享相同的 (單)功能,而不是創建 每一個。
  2. 可測性,因爲你 不能測試隱藏在閉包中的函數 。