2017-08-03 40 views
0

我在幾篇文章中讀到,應該將類方法添加到prototype而不是寫在函數體中,例如,繼承:這個私有變量的類模式有多好?

function MyClass() { 
    var privateVar = 5; 
} 
MyClass.prototype.getVar = function() { 
    return privateVar; // doesn't work! 
} 

但是訪問的變量,必須將它們公之於衆:

function MyClass() { 
    //Some IDEs know this should be private because of the _underscore. 
    this._privateVar = 5; 
} 
MyClass.prototype.getVar = function() { 
    return this._privateVar; // works 
} 

不過,我有一個想法,如何使類成員私有的,但它是一個多一點的努力。在這裏,我與轉移字符的加密類演示一下:

;"use strict"; 
 

 
var EncryptionClass = function() { 
 
    var priv = []; //The private namespaces of EncryptionClass instances 
 
    
 
    function EncryptionClass() { 
 
     //Create new private namespace for this instance: 
 
     var p = {}; 
 
     this.privI = priv.push(p) - 1; 
 
     
 
     //Private class member: 
 
     p.password = (Math.random() * 200) | 0; // integer between 0 and 200 
 
    } 
 
    
 
    EncryptionClass.prototype.encrypt = function (str) { 
 
     //Fetch private namespace 
 
     var p = priv[this.privI]; 
 
     
 
     var res = ""; 
 
     for (var i = 0; i < str.length; i++) 
 
      res += String.fromCharCode(str.charCodeAt(i) + p.password); 
 
     
 
     return res; 
 
    }; 
 
    
 
    return EncryptionClass; 
 
}(); 
 

 
//Test: 
 
var encryption = new EncryptionClass(); 
 
alert("Hello World\n" + encryption.encrypt("Hello World"));

這裏,privI變量是全球性的,但priv是在一個封閉的,所以私人的命名空間,不能從外部訪問。

我想知道你對這種模式的看法,以及它有什麼缺點/缺點。例如,我不確定這是否會導致內存泄漏

+0

將成員添加到全局名稱空間通常被認爲是不雅觀的。您可以改爲從匿名函數返回EncryptionClass。 – csander

+0

感謝您的建議。我會編輯它。 – Aloso

+1

這可能更適合代碼審查。 https://codereview.stackexchange.com/ – colecmc

回答

0

我不確定這是否會導致內存泄漏。

是的。這將導致可怕的內存泄漏 - 無論何時EncryptionClass實例被垃圾回收,這些私有名稱空間對象永遠不會。

這使得其他優點/缺點的所有討論都是徒勞的。