解决方案:使用闭包创建一个无法访问的“私有”范围。
"use strict";
(function (parent) {
(function (parent) {
var instances = {};
parent.getPrivateInstance = function (c) {
return instances[c];
};
parent.setPrivateInstance = function (c, value) {
instances[c] = value;
};
} (this));
parent.Class = function (name) {
setPrivateInstance(this, {
name: name
});
};
parent.Class.prototype.logName = function () {
console.log(getPrivateInstance(this).name);
};
})(window);
var c = new Class("test");
c.logName(); // "test"
console.log(c.name); // undefined
注意:内存泄漏
这将导致垃圾收集器不再清除与实例关联的内存,Class
因为它们将始终被引用,从而导致内存泄漏。
为了解决这个问题,我们必须手动删除对Class
. 这可以通过在节后添加一段代码parent.setPrivateInstance
和在节后添加一段代码来完成parent.Class.prototype.logName
。这些代码看起来像这样:
parent.deleteFromMemory = function (c) {
delete instances[c];
};
parent.Class.prototype.deleteFromMemory = function () {
deleteFromMemory(c);
};
用法
c = c.deleteFromMemory();
有关所有部分一起工作的示例:https ://jsfiddle.net/gjtc7ea3/
免责声明
由于此解决方案会导致内存泄漏,我个人建议不要使用它,除非您知道自己在做什么,因为这里很容易出错。