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-1

3.每次调用Symbol函数得到的符号永远不相等,无论符号名是否相同

【例1-2】

const syb1 = Symbol('符号');
const syb2 = Symbol('符号');
console.log(syb1 === syb2);

【结果】

图1-2

4.符号可以作为对象的属性名存在,这种属性称之为符号属性

【例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之所以可以输出符号,是它在内部进行了显式转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值