参考:https://www.jianshu.com/p/f40a77bbd74e
ES6 中引入了一种新的基础数据类型:Symbol
,它的功能类似于一种标识唯一性的 ID。
每一个 Symobl
实例都是唯一的,因此,当你比较两个 Symbol
实例的时候,将总会返回 false
:
Symbol() === Symbol()
// false
由于 Symbol
是一种基础数据类型,所以当我们使用 typeof
去检查它的类型的时候,它会返回一个属于自己的类型 symbol
,而不是什么 string
、object
之类。
let s = Symbol()
typeof(s)
// "symbol"
利用 Symbol
的属性,我们可以实现类的私有变量与私有方法。
const _radius = Symbol();
class Circle {
constructor(radius) {
this[_radius] = radius;
};
}
let c = new Circle(1);
把实例 c 打印出来看看:
Circle {Symbol(): 1}
Symbol(): 1
__proto__: Object
属性名变成了 Symbol()
,当我们用这个方法设置多个属性名时,外部看全部都是 Symbol()
,但彼此之间是不同的。
这种属性在外部是不可见的:
Object.getOwnPropertyNames(c)
// []
Object,keys(c)
// []
我们查看 c 对象的属性只能得到一个空数组 []
。
要查看这类属性我们使用 getOwnPropertySymbols
方法:
Object.getOwnPropertySymbols(c)
// [Symbol()]
实现私有方法可用以下办法:
const _radius = Symbol();
const _draw = Symbol();
class Circle {
constructor(radius) {
// 私有属性
this[_radius] = radius;
};
// 私有方法
[_draw] () {
console.log('draw');
};
}
let c = new Circle(1);
网友评论