V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
imdong
V2EX  ›  问与答

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

  •  
  •   imdong · 2020-07-09 15:47:26 +08:00 · 704 次点击
    这是一个创建于 1596 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    大概应该是这样

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

    1 条回复    2020-07-10 09:55:23 +08:00
    zhyl
        1
    zhyl  
       2020-07-10 09:55:23 +08:00 via Android
    用闭包就行了。具体的就是在构造函数里直接定义 getter,getter 访问局部变量构成一个闭包。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1051 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:30 · PVG 03:30 · LAX 11:30 · JFK 14:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.