いくつかの記事では、クラスメソッドを関数本体に書き込むのではなく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
は閉鎖中ですので、プライベートな名前空間が外部からアクセスすることができません。
私はあなたがこのパターンについて何を考えているのか、それにどのような欠点や欠点があるのかを知りたいと思います。たとえば、これがメモリリークになる可能性があるかどうかはわかりません。
一般に、グローバル名前空間にメンバーを追加するのは面倒だと考えられます。代わりに、匿名関数から 'EncryptionClass'を返すことができます。 – csander
アドバイスをいただきありがとうございます。私はそれを編集します。 – Aloso
これはコードレビューに適しています。 https://codereview.stackexchange.com/ – colecmc