/**
* 在ES6环境下如何实现属性和方法的私有化:
* 1.在命名时加下划线(非常不推荐)
* 2.使用ES6的Symbol
* 3.使用WeekMap
*/
/********************************************使用ES6的Symbol ***************************************/
/**
* 这里的Symbol()是一个函数,能创建一个Symbol,
* 每个Symbol都是一个独立的个体
* 这里的Symbol不是构造函数,不能再前面加new修饰符
*/
const _radius = Symbol();
const _draw = Symbol();
class Circle {
constructor(radius) {
// this.radius = radius;
// 上面和下面两种方法一样,都可以用来访问对象的属性
// this['radius'] = radius;
this[_radius] = radius;
}
/**
* 在ES6有一个新特性,就是可以计算生成属性名称
* 我们可以输入方括号,在里面写一个表达式
* 当这个表达式可以计算出结果
* 这个结果就会被设置成属性或者方法的名称
*/
[_draw]() {
}
}
const c = new Circle(1);
c.radius;
/**************************************使用WeekMap ****************************************/
/**
* WeakMap():弱映射对象
* 弱映射实际上是字典
* 字典里面的键是对象,而值可以任意。
* 之所以称之为弱映射,是因为它的键很弱
* 如果键没有引用了,它将会被垃圾回收机制删掉
*/
const _radius = new WeakMap();
const _move = new WeakMap();
class Circle {
constructor(radius) {
_radius.set(this, radius);
_move.set(this, () => {
console.log('move', this);
})
}
draw() {
_move.get(this)();
console.log("draw");
}
}
const c = new Circle(1);