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中使用,使用它来定义类属性外部模块无法访问,达到了私有化的目的。

上一篇下一篇

猜你喜欢

热点阅读