ES6新增数据类型符号(1):普通符号
在編程時,我們會遇到某些屬性,我們不需要或者不想要別人訪問它,即需要設置私有屬性,如下例,我們不需要在外部獲取getRandom這一屬性
const game = {attack: 30, //攻擊力hp: 100, //血量criticalStrike() { //暴擊const dmg = parseInt(this.attack * this.getRandom(1, 1.8));console.log(dmg);},getRandom(max, min) {return Math.random() * (max - min) + min;} } game.criticalStrike(); console.log(game);【結果】
?放在類中也是同樣的,無法設置私有屬性,如下例
class Game {constructor(attack, hp) {this.attack = attack;this.hp = hp;}criticalStrike() {const dmg = parseInt(this.attack * this.getRandom(1, 1.8));console.log(dmg);}getRandom(max, min) {return Math.random() * (max - min) + min;} } const game = new Game(30, 100); game.criticalStrike() console.log(game);【結果】
而在ES6之前,并沒有方法實現屬性私有化,因此ES6提供了新的數據類型Symbol,為我們提供設置私有屬性的方法,通過符號數據類型創建如下:
const syb = Symbol('這是一個符號'); console.log(syb);【結果】
【注】符號的特點
1.沒有字面量
2.使用typeof得到的類型是Symbol
【例1-1】
const syb = Symbol('這是一個符號'); console.log(typeof syb);【結果】
圖1-13.每次調用Symbol函數得到的符號永遠不相等,無論符號名是否相同
【例1-2】
const syb1 = Symbol('符號'); const syb2 = Symbol('符號'); console.log(syb1 === syb2);【結果】
圖1-24.符號可以作為對象的屬性名存在,這種屬性稱之為符號屬性
【例1-3】
const syb = Symbol('符號'); const obj = {a: 1,b: 2,[syb]: 3 } console.log(obj);【結果】
圖1-3-1可以看到,并不能得到第三項的屬性值,即第三項為對象的私有屬性,?因此文章剛開始出現的問題可以用如下代碼解決
const Game = (() => {const getRandom = Symbol('random');return class {constructor(attack, hp) {this.attack = attack;this.hp = hp;}criticalStrike() { //暴擊const dmg = parseInt(this.attack * this[getRandom](1, 1.8));console.log(dmg);}[getRandom](max, min) {return Math.random() * (max - min) + min;}} })(); const game = new Game(30, 100); console.log(game);【結果】
圖1-3-2關于獲取符號屬性的幾個點:
1)開發者可以通過精心的設計,讓這些屬性無法通過常規的方式被外界訪問
2)符號屬性是不能枚舉的,因此在for-in循環中無法讀取到符號屬性,Object.keys方法也無法讀取到符號屬性
3)Object.getOwnPropertyNames盡管可以得到所有無法枚舉的屬性,但是仍然無法讀取到符號屬性
4)ES6新增Object.getOwnPropertySymbols方法,可以讀取符號
const syb = Symbol(); const obj = {[syb]: 1,a: 2,b: 3 } for(const prop in obj) {console.log('forin循環結果:',prop); } console.log('Object.keys方法():',Object.keys(obj)); console.log('Object.getOwnPropertyNames方法():',Object.getOwnPropertyNames(obj)); console.log('Object.getOwnPropertySymbols方法():',Object.getOwnPropertySymbols(obj));【結果】
5.符號無法被隱式轉換,因此不能被用于數學運算、字符串拼接或其他隱式轉換的場景,但符號可以顯式轉換為字符串,通過String構造函數進行轉換即可,console.log之所以可以輸出符號,是它在內部進行了顯式轉換
總結
以上是生活随笔為你收集整理的ES6新增数据类型符号(1):普通符号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6语法规则之解构
- 下一篇: ES6新增数据类型符号(2):共享符号与