Symbol 使用场景
2022-09-19 本文已影响0人
Allan要做活神仙
1、作为对象属性名
let obj = {
[Symbol("name")]:"一斤代码",
age:18,
title:"Engineer",
}
console.log(Object.keys(obj))
for(let p in obj){
console.log(p);
}
console.log(Object.getOwnPropertyNames(obj));
image.png
由上可知,Symbol类型的Key不能通过Object.keys()或者for...in来枚举,它未被包含在对象自身的属性名集合中,所以,利用该特性,
可以把不对外开放的属性用Symbol定义
2、作为常量
我们经常使用常量来代表一种业务逻辑的几种不同的类型,我们希望这些常量是唯一的关系,经常需要为常量赋一个值,常量少的时候还算好,但是常量一多,你可能还得花点脑子好好为他们取个好点的名字。
const TYPE_AUDIO = "AUDIO";
const TYPE_VIDEO = "VIDEO";
const TYPE_IMAGE = "IMAGE";
function handleFileResource(resource) {
switch (resource.type) {
case TYPE_AUDIO:
playAudio(resource);
break;
case TYPE_VIDEO:
playVideo(resource);
break;
case TYPE_IMAGE:
previewImage(resource);
break;
default:
throw new Error("Unknown type of resource");
}
}
使用Symbol就更加方便了
const TYPE_AUDIO = Symbol();
const TYPE_VIDEO = Symbol();
const TYPE_IMAGE = Symbol();
这样就可以保证这3个常量是唯一的值了
3、定义类的私有属性/方法
在javaScript中,没有如同java等面向对象语言的定义私有属性的private方法,类上所有定义的属性或者方法都是可以公开访问的。有了Symbol以及模块化机制,类的私有属性和方法变得可能。
a.js中:
const PASSWORD = Symbol()
class Login {
constructor(username,password){
this.username = username;
this[PASSWORD] = password
}
checkPassword(pwd){
return this[PASSWORD] === pwd
}
}
export default Login;
b.js中:
import Login from "./a";
const login = new Login("admin", "123456");
login.checkPassword("123456"); // true
login.PASSWORD; // undefined
login[PASSWORD]; // undefined
login["PASSWORD"]; // undefined
由于Symbol常量PASSWORD被定义在a.js模块中,外面模块b.js无法获取此Symbol(Symbol是唯一的),因此PASSWORD只能被限定在a.js中使用,使用它来定义类属性外部模块无法访问,达到了私有化的目的。