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
是在一個封閉的,所以私人的命名空間,不能從外部訪問。
我想知道你對這種模式的看法,以及它有什麼缺點/缺點。例如,我不確定這是否會導致內存泄漏。
將成員添加到全局名稱空間通常被認爲是不雅觀的。您可以改爲從匿名函數返回EncryptionClass。 – csander
感謝您的建議。我會編輯它。 – Aloso
這可能更適合代碼審查。 https://codereview.stackexchange.com/ – colecmc