求助大佬,关于 JavaScript 中 new fun() 的私有属性的问题。

2020-07-09 15:47:26 +08:00
 imdong

在一个页面中,同一个对象会被创建多个实例,同时这些实例是相互独立运行的。

但是实例中有一些私有属性不想对外暴露,而且每个实例间属性也是独立的。

大概应该是这样

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() 依然可以访问,崩溃了...

698 次点击
所在节点    问与答
1 条回复
zhyl
2020-07-10 09:55:23 +08:00
用闭包就行了。具体的就是在构造函数里直接定义 getter,getter 访问局部变量构成一个闭包。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/688585

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX