我见过有人试图尝试在 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/