javascript - JS中私有(private)方法的一种尝试

标签 javascript function oop private

我见过有人试图尝试在 JS 中实现私有(private)方法。然而,它们都有不同的问题,例如:JavaScript private methods

我相信我的尝试也存在一些问题。但是除了严格模式下不允许的开销和调用者之外,我的实现还有哪些问题? 您可以在 jsfiddle 中看到一个工作示例:http://jsfiddle.net/rabbit_aaron/oqpen8c8/17/

实现也粘贴在这里:

var CLASS = function () {
    this.publicFunctions = {};
    this.PROTOTYPE = {};
    var _class = function () {
        this.constructor.apply(this, arguments);
    };
    _class.prototype = this.PROTOTYPE;
    _class.prototype.validateAccess = CLASS.prototype.validateAccess;
    _class.prototype.constructor = function () {};
    _class.prototype.publicFunctions = this.publicFunctions;
    this.finalClass = _class;

    return this;
};

CLASS.prototype.validateAccess = function (caller) {
    if (this.publicFunctions[caller] !== caller) {
        throw 'Accessing private functions from outside of the scope';
    }
    return true;
};
CLASS.prototype.setConstructor = function (func) {
    this.PROTOTYPE.constructor = func;
};
CLASS.prototype.addPrivateFunction = function (name, func) {
    this.PROTOTYPE[name] = function () {
        this.validateAccess(this[name].caller);
        func.apply(this, arguments);
    };
    return this;
};

CLASS.prototype.addPublicFunction = function (name, func) {
    this.PROTOTYPE[name] = func;
    this.publicFunctions[this.PROTOTYPE[name]] = this.PROTOTYPE[name];
    return this;
};


CLASS.prototype.getClass = function () {
    return this.finalClass;
};

最佳答案

首先想到的是,在稍后加载的某些代码中执行以下操作非常简单:

instanceOfSubClass.validateAccess = function (caller) {
    return true;
}

这有效地覆盖了验证。几乎所有不涉及使用嵌套作用域来隐藏变量的私有(private)变量技巧都会遇到这个问题。当然,这是一件非常具体的事情,必须知道要做的事情,所以这取决于您想要防止什么。如果您只是想在将来保护自己免受侵害,那么这可能会很好地工作,但是如果您要发布一个将与您不编写的代码交互的库,并且您希望确保它始终表现正常,那么这这不是要走的路。

关于javascript - JS中私有(private)方法的一种尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25303961/

相关文章:

javascript - 如何检查数组元素是否匹配某些模式(例如 :XXXXYY)?

c - 使用结构搜索并匹配数组元素

C++ 类似函数的值传递

c - 如何使用文件和 malloc 构造函数

c++ - 在手动调用析构函数期间发生错误 : expression must be a pointer to a complete object type

python - 一个小项目的想法,我应该使用 Python 吗?

c# - OOP - 两个表到同一个对象

javascript - 在 URL 中使用多个片段标识符

javascript - 在输入数字字段上显示前导零

javascript - 如何使用 jQuery 允许用户只投票一次?