js 管理私有属性

class Countdown {
    constructor(counter, action) {
        Object.assign(this, {
            dec() {
                if (counter < 1) return;
                counter--;
                if (counter === 0) {
                    action();
                }
            }
        });
    }
}

优点:

私有数据非常安全;
私有属性的命名不会与其他父类或子类的私有属性命名冲突。
缺点:

当你需要在构造函数内把所有方法(至少那些需要用到私有数据的方法)添加到实例的时候,代码看起来就没那么优雅了;
作为实例方法,代码会浪费内存;如果作为原型方法,则会被共享。

class Countdown {
    constructor(counter, action) {
        this._counter = counter;
        this._action = action;
    }
    dec() {
        if (this._counter < 1) return;
        this._counter--;
        if (this._counter === 0) {
            this._action();
        }
    }
}

优点:

代码比较美观;
可以使用原型方法。
缺点:

不够安全,只能用规范去约束用户代码;
私有属性的命名容易冲突。

let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
    constructor(counter, action) {
        _counter.set(this, counter);
        _action.set(this, action);
    }
    dec() {
        let counter = _counter.get(this);
        if (counter < 1) return;
        counter--;
        _counter.set(this, counter);
        if (counter === 0) {
            _action.get(this)();
        }
    }
}

优点:

可以使用原型方法;
比属性命名约定更加安全;
私有属性命名不会冲突。
Con:

代码不如命名约定优雅。

const _counter = Symbol('counter');
const _action = Symbol('action');

class Countdown {
    constructor(counter, action) {
        this[_counter] = counter;
        this[_action] = action;
    }
    dec() {
        if (this[_counter] < 1) return;
        this[_counter]--;
        if (this[_counter] === 0) {
            this[_action]();
        }
    }
}

优点:

可以使用原型方法;
私有属性命名不会冲突。
缺点:

代码不如命名约定优雅;
不太安全:可以通过 Reflect.ownKeys() 列出一个对象所有的属性键名(即使用了 Symbol)。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,489评论 25赞 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,187评论 19赞 139
  • 不知道从何开始自己的认知慢慢变得模糊。自信慢慢从心里从有谱变得迷茫起来,不知道何去何从。自制力更是差的都不好意思开...
    大奎小王阅读 161评论 0赞 1
  • 如若初见说“你好!”风在笑,你在笑,笑意泛上眉梢。 许久以后说“你好” 那是熟悉,是玩笑,“你好啊!” 如若发呆说...
    阿Li大人阅读 194评论 0赞 5
  • 昨天晚上梦见捉到了一条大鲤鱼,那条鱼在河里半死不活的,我去捉的时候也没有太大的反抗。捉好鱼回家准备给大人,结果只有...
    西兰河阅读 385评论 0赞 0

友情链接更多精彩内容