我想出了一个在JavaScript中增加隐私支持的想法。我还没有在网上发现类似的东西,所以我想这可能是因为这个想法很糟糕,但我还是想看到一些回应,只是为了确定一下。
var util = {
s4: function() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
},
guid: function() {
return util.s4() + util.s4() + '-' + util.s4() + '-' + util.s4() + '-' +
util.s4() + '-' + util.s4() + util.s4() + util.s4();
}
};
// template
var Class = (function() {
var privates = {};
var getPrivates = function(obj) {
return privates[ obj.getGUID() ];
};
function Class() {
var guid = util.guid();
privates[guid] = {};
this.getGUID = function() {
return guid;
};
};
return Class;
})();
var MyClass = (function() {
var privates = {};
var getPrivates = function(obj) {
return privates[ obj.getGUID() ];
};
function MyClass(a, b) {
var guid = util.guid();
privates[guid] = {};
this.getGUID = function() {
return guid;
};
var private = getPrivates(this);
private.a = a;
this.b = b;
};
return MyClass;
})();
var obj = new MyClass("private", "public");
console.log(obj.a, obj.b);发布于 2014-08-06 13:10:23
有趣的问题,
正如评论中提到的,隐私支持可以(更好)通过模块或IFFE实现。
总的来说,您的设计是不健全的,您的GUID创建代码在生成唯一id的过程中非常薄弱,您将有重叠的GUID和(难以再现)的错误。
此外,如果可以在privates上迭代并查看存储在其中的所有值,则变量并不完全是私有的。
最后,我认为你可能有一个很好的理由来完成双重任务,这个
var MyClass = (function() {
var privates = {};
var getPrivates = function(obj) {
return privates[ obj.getGUID() ];
};
function MyClass(a, b) {
var guid = util.guid();
privates[guid] = {};
this.getGUID = function() {
return guid;
};
var private = getPrivates(this);
private.a = a;
this.b = b;
};
return MyClass;
})();可能是
var MyClass = (function() {
var privates = {};
function MyClass(a, b) {
var private = privates[util.guid()] = {};
private.a = a;
this.b = b;
};
return MyClass;
})();从棉/暗示的角度看,你遇到了一些分号问题,但也没什么不好的。
https://codereview.stackexchange.com/questions/29323
复制相似问题