[TOC]
>[success] # Symbol全局私有屬性
~~~
假設你想'在同一個文件2個對象中使用同一個Symbol屬性',或者說'在2個js文件的對象中使用同一個Symbol屬性'
跨越文件或代碼來追蹤'Symbol'是很困難并且易錯的。
為此'ES6'為了這種情況出了一個屬性'Symbol.for()'方法來定義共享的'Symbol'屬性,'Symbol.for()'方法
僅接受'單個字符串類型的參數',作為目標'Symbol'的標識符,同時此參數也會成為該'Symbol'的描述信息。
例如:
~~~
~~~
// 創建一個全局的Symbol私有屬性
let uid = Symbol.for("uid")
// 在對象中使用這個uid私有屬性
let object = {
[uid]: '12345'
}
console.log(object[uid]) // "12345"
console.log(uid) // "Symbol(uid)"
~~~
<br/>
>[success] ## Symbol.for() 注冊全局Symbol
~~~
'Symbol.for()'方法首先會搜索'全局Symbol注冊表',看是否存在一個鍵值為 "uid" 的'Symbol'。如果存在,
該方法會'返回這個已存在的Symbol',否則,會創建一個新的'Symbol',并使用該鍵值將其記錄到全局'Symbol'
注冊表中,然后'返回這個新的Symbol'。這就意味著此后使用同一個鍵值去調用'Symbol.for()'方法都將會
'返回同一個Symbol',就像下面這個例子:
~~~
~~~
// 創建一個全局的Symbol
let uid = Symbol.for("uid")
// 在對象中使用這個uid私有屬性
let object = {
[uid]: "12345"
}
console.log(object[uid]) // "12345"
console.log(uid) // "Symbol(uid)"
// 查看全局Symbol注冊表中是否有uid,如果有就使用現有的,如果沒有就創建新的Symbol
let uid2 = Symbol.for("uid")
console.log(uid === uid2) // true
console.log(object[uid2]) // "12345"
console.log(uid2) // "Symbol(uid)"
~~~
~~~
上面例子中,'uid'與'uid2'包含同一個'Symbol',因此它們可以互換使用。第一次調用'Symbol.for()'創建
了這個'Symbol',而第二次調用則從'全局Symbol注冊表'中將其檢索了出來。
~~~
<br/>
>[success] ## Symbol.keyFor() 根據私有屬性名稱,搜索全局Symbol注冊表
~~~
你可以使用'Symbol.keyFor()'方法在'全局Symbol注冊表'中根據'Symbol'檢索出對應的鍵值,例如:
~~~
~~~
let uid = Symbol.for("uid")
console.log(Symbol.keyFor(uid)) // "uid"
let uid2 = Symbol.for("uid")
console.log(Symbol.keyFor(uid2)) // "uid"
let uid3 = Symbol("uid")
console.log(Symbol.keyFor(uid3)) // undefined,因為全局Symbol注冊表中沒有uid3,uid3是局部的
~~~
~~~
使用Symbol uid 與 uid2 都返回了鍵值 "uid" ,而Symbol uid3 在全局符號注冊表中并不存在,因此沒有關聯
的鍵值, Symbol.keyFor() 方法只會返回 undefined 。
~~~
- Javascript基礎篇
- Array數組
- 數組插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向對象思想
- Javascript 面向對象編程(一):封裝
- Javascript面向對象編程(二):構造函數的繼承
- Javascript面向對象編程(三):非構造函數的繼承
- 解構
- 數組的解構賦值
- 對象的解構賦值
- 函數參數解構
- 字符串的解構賦值
- 數值和布爾值的解構賦值
- 圓括號問題
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初識遞歸
- 渲染ul-li樹形結構
- 異步函數解決方案
- 1. callback回調函數
- 2. ES6 - Promise
- JavaScript高級程序設計(書)
- 在html中使用JavaScript
- script標簽的位置
- 延遲腳本
- 異步腳本
- <noscript>元素
- 基本概念
- 嚴格模式
- 變量詳解
- 數據類型
- typeof操作符
- undefined類型
- Null類型
- Boolean類型
- Number類型
- 深入了解ES6(書)
- var 、let 、 const
- 字符串與正則表達式
- 字符串
- 正則表達式
- 函數
- 函數形參默認值
- 使用不具名參數
- 函數構造器的增強能力
- 擴展運算符
- name屬性
- 明確函數的多重用途
- 塊級函數
- 箭頭函數
- 尾調用優化
- 擴展的對象功能
- 對象類別
- 對象字面量語法的擴展
- ES6對象新增方法
- 重復的對象屬性
- 自有屬性的枚舉順序
- 更強大的原型
- 解構:更方便的數據訪問
- 為什么要用解構?
- 對象解構
- 數組解構
- 混合解構
- 參數解構
- Symbol與Symbol屬性
- 創建Symbol
- Symbol的使用方法
- Symbol全局私有屬性
- Symbol與類型強制轉換
- Symbol屬性檢索
- Symbol的一些構造方法
- Set集合與Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS標準內置對象
- Object 構造函數及屬性
- Object 構造方法
- Symbol 內建對象類的函數及屬性
- Set 構造函數及屬性
- Weak Set 構造函數及屬性
- JS雜項
- 類數組對象
- Class類的理解和使用