符号是 ES 6 新增的一个数据类型,它通过 Symble(描述信息) 来创建
符号设计的初衷是为了给对象添加私有属性,也就是说这个属性只供在我这个对象内部的方法使用,不希望在外面被别人使用,很多面向对象语言都会有私有属性这个概念,很可惜 JS 没有。
符号具有以下特点:
- 没有字面量
- 使用 typeof 得到的类型是 symbol
- 每次调用 Symbol 函数得到的符号永远不相等,无论符号名是否相同
- 符号可以作为对象的属性名存在,这种属性称之为符号属性
- 开发者可以通过精心的设计,让这些属性无法通过常规方式被外界访问
- 符号属性是不能枚举的,因此在 for-in 循环中无法读取到符号属性,Object. keys 方法也无法读取到符号属性
- Object. getOwnPropertyNames 尽管可以得到所有无法枚举的属性,但是仍然无法读取到符号属性
- ES 6 新增 Object. getOwnPropertySymbols 方法,可以读取符号
- 符号无法被隐式转换,因此不能被用于数学运算、字符串拼接或其他隐式转换的场景,但符号可以显式的转换为字符串,通过 String 构造函数进行转换即可,console. log 之所以可以输出符号,是它在内部进行了显式转换
js
const syb = Symbol();
const obj = {
a:1,
[syb]:2,//这就是一个符号属性
};接下来用符号属性实现私有属性
js
const obj = (function(){
const test = Symbol();
return {
[test]:"abc",
print(){
console.log(this[test]);
}
}
})();
obj.print();//正常输出
//由于symbol的唯一性,我们无法再在外部访问这个属性使用这种方式之后,这就是一个私有属性了,我们无法再通过常规方式访问到这个属性。
同样,类也可以
js
const Test = (function(){
const test = Symbol();
return class {
[test](){
console.log(1);
}
}
})();