Symbol的使用
Symbol的使用場景
使用Symbol來作為對象屬性名(key)
通常定義或訪問對象的屬性時都是使用字符串:
let obj = {abc: 123,"hello": "world" }obj["abc"] // 123 obj["hello"] // 'world'在利用Symbol以后定義和訪問對象的屬性:
const PROP_NAME = Symbol()
const PROP_AGE = Symbol()
Symbol類型的key不能通過Object.keys()或者for…in來枚舉。它沒有被包含在對象自身的屬性名集合(property names)里面。
l
et obj = {[Symbol('name')]: '君莫笑',age: 18,title: 'Engineer' }Object.keys(obj) // ['age', 'title']for (let p in obj) {console.log(p) // 分別會輸出:'age' 和 'title' }Object.getOwnPropertyNames(obj) // ['age', 'title']利用這個特性,可以把一些不需要對外操作和訪問的屬性用Symbol來定義
使用JSON.stringify()將對象轉換成JSON字符串時,Symbol屬性會被排除在輸出內容之外。
JSON.stringify(obj) // {"age":18,"title":"Engineer"}獲取Symbol方式定義的對象屬性,專門針對Symbol的API getOwnPropertySymbols
// 使用Object的API Object.getOwnPropertySymbols(obj) // [Symbol(name)]// 使用新增的反射API Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']使用Symbol來替代常量
我們經常定義一組常量來代表一種業務邏輯下的幾個不同類型,我們通常希望這幾個常量之間是唯一的關系,為了保證這一點,我們需要為常量賦一個唯一的值。
比如如下的’AUDIO’、‘VIDEO’、 ‘IMAGE’
const TYPE_AUDIO = 'AUDIO' const TYPE_VIDEO = 'VIDEO' const TYPE_IMAGE = 'IMAGE'function handleFileResource(resource) {switch(resource.type) {case TYPE_AUDIO:playAudio(resource)breakcase TYPE_VIDEO:playVideo(resource)breakcase TYPE_IMAGE:previewImage(resource)breakdefault:throw new Error('Unknown type of resource')} }在使用Symbol定義常量以后就會相當方便
const TYPE_AUDIO = Symbol() const TYPE_VIDEO = Symbol() const TYPE_IMAGE = Symbol()這樣可以直接保證三個常量的值是唯一的。
使用Symbol定于類的私有屬性/方法
JS中沒有訪問控制關鍵字。類上所有定義的屬性或者方法都是可以公開的。使用Symbol,再加上模塊化機制以后,類的私有屬性和方法才能變成可能;
在文件a.js中
const PASSWORD = Symbol()class Login {constructor(username, password) {this.username = usernamethis[PASSWORD] = password}checkPassword(pwd) {return this[PASSWORD] === pwd} }export default Login? 在文件b.js中
const login = new Login('admin', '123456')login.checkPassword('123456') // truelogin.PASSWORD // oh!no! login[PASSWORD] // oh!no! login["PASSWORD"] // oh!no!9
由于Symbol常量PASSWORD被定義在a.js所在的模塊中,外面的模塊獲取不到這個Symbol,也不可能再創建一個一模一樣的Symbol出來(因為Symbol是唯一的),因此這個PASSWORD的Symbol只能被限制在a.js內部使用,所以使用它來定義的類屬性是沒有辦法被模塊外訪問到的,達到了一個私有化的效果。
總結
- 上一篇: 注册表关闭计算机默认共享,4种方法教你彻
- 下一篇: python实现.jpeg转.jpg