私用成员の纠结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了私用成员の纠结相关的知识,希望对你有一定的参考价值。

技术分享

众所周知 js中是没有关键字直接添加私有属性的 在es6没出来之前 都是通过前缀‘_‘或者闭包解决的

在es6诞生后 又有几种解决方法了 使用 Map 和 Symbol! 

先来看第一种 最土的方法 也是最简单暴力的

const Miku = function(){
          this._a = 1,
          this._b = 2;
      };

约定私有属性前面加上‘_‘   一种自慰方式而已 并没有用 接口完全暴露 可以随意修改  。。

我们可通过闭包 来解决私有成员

const Miku = function(){
          const Miku = function({song=1}){
              var s = song;
              this.getS = ()=> s
              this.setS = n=>s=n;
          };
          Miku.prototype.sing = function(){
              console.log(this.getS())
          };
          return Miku;
      }();
      const mku = new Miku({song:‘live‘});
      mku.sing(); //live

不使用this创建属性或方法 这里的s变量作用范围只存在与构造器中 所以s成为了一个私有属性

只能通过getS setS访问 她俩也就成为了特权方法

不过这样效率很低  每个实例都会生成新的方法副本 。。

 

我们来使用Map解决 因为Map的键值可以是一个对象 于是这么做

const Miku = function(){
          const mp = new Map();
          const Miku = function({song=1}){
              
              mp.set(this , {song});
          };
          Miku.prototype.sing = function(){
              const o = mp.get(this);
              console.log(o.song);
          }
          return Miku;
      }();
      const mku = new Miku({song:‘live‘});
      mku.sing();//live

使用Map绑定this  外部没有任何办法访问!感觉非常完美 !

 

还有一种方式使用Symbol Symbol值是唯一的 也是没法直接访问的

const Miku = function(){
          const syo = Symbol(‘...‘);
          class Miku {
              constructor(a=[]){
                  this[syo] = a||[];
              }
              sing(){
                  for(let s of[...Miku.f(this[syo]||[])]) console.log(s);
              }
              static *f(a){
                  yield `Miku is singing${a.shift()}...`;
                  if(a.length) yield *Miku.f(a);
              }
          }
          return Miku;
      }();
      
      var mku=new Miku([‘live‘,‘Starlight‘,‘Sweet Devil‘])
      mku.sing();
      // Miku is singinglive...
        // Miku is singing‘Starlight...
        // Miku is singing‘Sweet Devil...

Map和Symbol 是差不多的东西

但是 让人不解的是 可以利用getOwnPropertySymbols 间接抓取到Symbol对象

var mku=new Miku([‘live‘,‘Starlight‘,‘Sweet Devil‘]);
      for(let a of Object.getOwnPropertySymbols(mku))
          //做些害羞的事
      mku.sing();

那么 为何要提供getOwnPropertySymbols方法给我们呢? 难道是不建议我们用Symbol做封装么?不解!

 

如还有其他解决方案 欢迎补充~

 

以上是关于私用成员の纠结的主要内容,如果未能解决你的问题,请参考以下文章

第八章:Python基础の面向对象(下集)

分享几个实用的代码片段(第二弹)

分享几个实用的代码片段(第二弹)

Docker搭建私用仓库

搭建 nuget 私用库 BaGet

SSH私用私钥登陆