2017-08-03 11 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インスタンスがガベージコレクトされても、それらのプライベートな名前空間オブジェクトは決して決してなりません。

これは、他の長所/短所に関するすべての議論が無駄になります。

関連する問題