这个带有私有变量的类模式有多好?

时间:2017-08-03 20:04:17

标签: javascript class design-patterns prototype private

我在几篇文章中读到,应该将类方法添加到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位于闭包中,因此无法从外部访问私有名称空间。

我想知道您对此模式的看法,以及它有哪些缺点/缺点。例如,我不确定这是否会导致内存泄漏< /强>

1 个答案:

答案 0 :(得分:0)

  

我不确定这是否会导致内存泄漏。

确实是的。它会导致可怕的内存泄漏 - 无论何时对EncryptionClass实例进行垃圾回收,这些私有命名空间对象都不会。

这使得对所有其他优点/缺点的讨论徒劳无功。