在编程时,我们会遇到某些属性,我们不需要或者不想要别人访问它,即需要设置私有属性,如下例,我们不需要在外部获取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之所以可以输出符号,是它在内部进行了显式转换

ES6新增数据类型符号(1):普通符号相关推荐

  1. ES6新增数据类型符号(2):共享符号与知名符号

    目录 1.共享符号 2.知名符号 1.共享符号 上节课讲到每次调用得到的符号都是不相同的,但是存在需要同一个符号的需求,因此ES6提供了静态方法for,可以根据某个符号名称(符号描述)得到同一个符号, ...

  2. es6 新增数据类型_ES6新增特性整理

    整理这些东西主要是为了方便自己想用的时候能够快速查询,其中不可避免会引用.借鉴到其他大佬的优秀成果,还请多多包涵.如有不妥之处,还请不吝赐教. pany:ES6新特征总结​zhuanlan.zhihu ...

  3. ES6新增数据类型:Symbol

    [学习es6新增的数据类型 Symbol] 1.symble 的作用 symbol 是 es6 新增的一个基本的数据类型,定义唯一值的:一般用于给对象添加私有属性. 2.symble 的用法 < ...

  4. es6 新增数据类型Symbol

    es6在string number boolean null undefined object之外又新增了一种Symbol类型. Symbol意思是符号,有一个特性-每次创建一个Symbol值都是不一 ...

  5. ES6基本数据类型总结

    ES5的基本数据类型有:Number,String,Boolean,null,undefined ES6基本数据类型:Number,String,Boolean,null,undefined,symb ...

  6. java int 无符号_Java 无符号数据类型

    Java数据类型教程 - Java无符号数据类型 Java不支持无符号数据类型. byte,short,int和long都是有符号数据类型. 对于有符号数据类型,值范围的一半存储正数,一半用于负数,因 ...

  7. plc位、字节、字、双字、有符号、无符号数据类型的关系

    plc位.字节.字.双字.有符号.无符号的关系 以下内容由深圳市综科智控科技开发有限公司编辑整理 2021/08/18 前言:很多同学在PLC开发过程中,因为数据类型选择错误而出现得到的数据和期望的数 ...

  8. c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:

    基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:单精度型:float 双精度型:double 长 ...

  9. ES6新增 Symbol

    Symbol的诞生? Symbol的诞生,也就是Symbol存在的意义 之前我们的对象属性的数据类型都是字符串,没有其他的了.所以会导致属性名重复,导致属性值被覆盖的情况.比如,你使用了一个他人提供的 ...

最新文章

  1. Linux多线程与同步
  2. React Native自学--嵌入到原生应用
  3. java 通配符 日期_java – 使用带有通配符支持的SimpleDateFormat解析日期字符串(例如* yyyy * MM * dd * hh * mm * ss)...
  4. PHP函数处理方法总结
  5. 手把手教你如何在阿里云ECS搭建Python TensorFlow Jupyter
  6. python带通配符的字符串匹配_Bash技巧:实例介绍数个参数扩展表达式以处理字符串变量...
  7. OOP-ECMAScript - 深入理解Javascript
  8. python numpy loadtxt
  9. php微信自动登录,利用php怎么实现一个自动登录微信并获取昵称的功能
  10. [原创]完美开启Win8中管理员Administrator帐户
  11. ecshop getRow getAll getOne 返回值的区别
  12. 苏槐: 数据治理的本质及实践
  13. RemapKey等:小巧实用的键盘映射工具
  14. APK应用程序的解包、修改、编辑、汉化、打包及应用
  15. Android热修复Sophix详解
  16. 我在Facebook干不下去的10个理由
  17. tar压缩和解压文件或文件夹
  18. 王春亮用心接待全国的调养者和学习者
  19. 使用jquery的bind来检测textarea,input等的文本变化
  20. 最新小储云商城V1.782免授权源码

热门文章

  1. PyCairo 中的图片
  2. 读《Android 安全架构深究》
  3. linux命令 ps aux | grep xxx详解
  4. 线程和进程的对比之优缺点
  5. 使用VMware VSphere WebService SDK进行开发 (一)——基本信息阐述
  6. linux下使用C++操作mysql
  7. 音视频技术开发周刊 | 203
  8. 畅享音视频技术饕餮盛宴,就在LiveVideoStackCon 上海站
  9. Linux下Crontab定时执行命令
  10. ​Linux CPU 性能优化指南