我看到有人试图在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;
};
答案 0 :(得分:1)
首先想到的是,在稍后加载的某些代码中执行以下操作非常简单:
instanceOfSubClass.validateAccess = function (caller) {
return true;
}
这有效地覆盖了验证。几乎所有不使用嵌套作用域来隐藏变量的私有变量技巧都会遇到这个问题。当然,这是一个非常具体的事情,必须要知道,所以这取决于你想要防范的东西。如果你只是想在将来保护自己,那么这可能会正常工作,但是如果你要发布一个与代码交互的库,你就不会写,你想确保它总能正常运行,那么现在就不行了。
答案 1 :(得分:0)
我相信我的尝试也存在一些问题。
是
但是在严格模式下不允许开销和调用者
我不会称这是一个问题,我称之为禁止。严格模式应该是默认模式。
我的实施有什么问题?
关于制作方法的方法"私人":
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才能实现真正的隐私。