在一个页面中,同一个对象会被创建多个实例,同时这些实例是相互独立运行的。
但是实例中有一些私有属性不想对外暴露,而且每个实例间属性也是独立的。
大概应该是这样
let Obj = function(n){
this.num = n + Math.random();
};
Obj.prototype.get = function(){
console.log(this.num);
}
let a = new Obj(1),
b = new Obj(2);
a.get(); // 1.xxx
b.get(); // 2.xxx
// 且满足如下
console.log(a.num); // undefined
console.log(b.num); // undefined
目前能想到的办法只有如下这样似乎非常不优雅的方法。
(function (window) {
/**
* 创建一个私有的数据存储方法
*/
let data = [],
dataBucket = function () {
if (!this instanceof Obj) {
return null;
}
return data[this.data_id];
}
let obj = function (n) {
this.data_id = data.length + 1;
data[this.data_id] = {};
this.data().num = n + Math.random();
};
// 映射读写到私有方法上
obj.prototype.data = function () {
return dataBucket.call(this);
}
obj.prototype.get = function () {
console.log(this.data().num);
}
window.Obj = obj;
})(window);
let a = new Obj(1),
b = new Obj(2);
a.get(); // 1.xxx
b.get(); // 2.xxx
所以,大佬们,有没有更好的方法???
或者是原生有方法,是我太菜不知道呢?
求鞭打...
======= 更新,发完贴有检查了一下,发现 a.data() 依然可以访问,崩溃了...
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.