私用成员の纠结
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 singing‘live... // 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做封装么?不解!
如还有其他解决方案 欢迎补充~
以上是关于私用成员の纠结的主要内容,如果未能解决你的问题,请参考以下文章