Symbol风格的JS类私有属性和私有方法的疑问

weixin_44707818 2019-03-01 02:02:11
初入JS,没有私有的概念觉得很没安全感。
找了很多帖子,也没有比较完美的解决办法。
比较下WeakMap和Symbol方案还是可以接受的。
其中Symbol方案的性能损失可能是最小的。找到的范例是这么写的:

var Person=(function () {
const _first_name = Symbol();
const _last_name = Symbol();
const get_full_name = Symbol();
class Person{
constructor(first_name, last_name){
this[_first_name] = first_name;
this[_last_name] = last_name;
}
get full_name(){
return this[get_full_name]();
}

[get_full_name](){
return `${this[_first_name]} ${this[_last_name]}`;
}

}
return Person;
})();

自己觉得每个私有属性和私有方法都要定义一个Symbol写法上超麻烦。

var Person = (function () {

const _ = Symbol();

class Person{
constructor(first_name, last_name){
this[_] = {
first_name:first_name,
last_name:last_name,
get_full_name(self){
return `${self.first_name} ${self.last_name}`;
},
}
}
get full_name(){
return this[_].get_full_name(this[_]);
}
}
return Person;
})();
// 所有的私有属性都通过 this[_]去访问。
// 唯一麻烦就是私有方法调用要传this[_]

疑问:私有方法get_full_name(self), 是不是只有一份,还是每个实例都复制了一份。
希望高手解答一下,谢谢。
...全文
213 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44707818 2019-03-01
  • 打赏
  • 举报
回复

var Person = (function () {

    const f = Symbol('f');  // private fields symbol
    const m = Symbol('m');  // private methods symbol

    class Person {

        constructor(first_name, last_name) {
            this[f] = {
                // define all private fields here
                // get field use `this[f].first_name`
                first_name: first_name,
                last_name: last_name,
            };
        }

        get full_name() {
            return this[m].get_full_name.call(this)
        }
    }

    Person.prototype[m] = {
        // define all private methods here
        // call private method use `this[m].get_full_name.call(this)`
        get_full_name() {
            return `${this[f].first_name} ${this[f].last_name}`;
        },
    };
    
    return Person;
})();
自己的改进版,应该是比较完美了。唯一就是 call()比较烦人。
丰云 2019-03-01
  • 打赏
  • 举报
回复
js本没有这些概念,也用不着这些东西,何必强求强取。。。。 菜刀切菜,砍刀砍柴,非要拿菜刀砍柴,拿砍刀切菜,也不是不可以, 只是觉得。。。嘿嘿。。。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧