JS中私有方法的一次尝试

时间:2014-08-14 08:54:04

标签: javascript function oop private

我看到有人试图在JS中尝试实现私有方法。但是它们都有不同的问题,例如: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;
};

2 个答案:

答案 0 :(得分:1)

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

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

这有效地覆盖了验证。几乎所有不使用嵌套作用域来隐藏变量的私有变量技巧都会遇到这个问题。当然,这是一个非常具体的事情,必须要知道,所以这取决于你想要防范的东西。如果你只是想在将来保护自己,那么这可能会正常工作,但是如果你要发布一个与代码交互的库,你就不会写,你想确保它总能正常运行,那么现在就不行了。

答案 1 :(得分:0)

  

我相信我的尝试也存在一些问题。

  

但是在严格模式下不允许开销和调用者

我不会称这是一个问题,我称之为禁止。严格模式应该是默认模式。

  

我的实施有什么问题?

关于制作方法的方法"私人":

  • 很容易规避你的措施。就像@Austion一样,你可以简单地覆盖validateAccess函数,但你也可以搞乱公共publicFunctions对象
  • 它只是隐藏方法,而不是字段。将非功能属性设为私有通常是更相关的目标,因为它们包含实例的(保护应用)状态。
  • 它不适用于没有Function::toString反编译的引擎(有一些旧的反编译)。此外,它不适用于以编程方式创建(作为闭包)并共享同一主体的方法。

您的实施中可能有一些错误可以修复:

  • 私人方法可以return一个值
  • 私有方法无法调用其他私有方法,只有公共方法可以调用它们
  • this.constructor.apply(this, arguments);是一个很好的想法,可以创建一个可设置的构造函数。但是,a)一旦尝试继承就会失败(可以通过调用_class.prototype.constructor来修复)和b)破坏fn.prototype.constructor == fn / Object.getPrototypeOf(instance)==instance.constructor.prototype
  • 的经验法则

请记住,只有通过use of closures才能实现真正的隐私。