Skip to content

符号是 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);
		}
	}
})();

以笔记为镜,可以知得失