4. Symbol
1. 唯一值
- // 例子 4-1
- // bad
- // 1. 创建的属性会被 for-in 或 Object.keys() 枚举出来
- // 2. 一些库可能在将来会使用同样的方式,这会与你的代码发生冲突
- if (element.isMoving) {
- smoothAnimations(element);
- }
- element.isMoving = true;
- // good
- if (element.__$jorendorff_animation_library$PLEASE_DO_NOT_USE_THIS_PROPERTY$isMoving__) {
- smoothAnimations(element);
- }
- element.__$jorendorff_animation_library$PLEASE_DO_NOT_USE_THIS_PROPERTY$isMoving__ = true;
- // better
- var isMoving = Symbol("isMoving");
- ...
- if (element[isMoving]) {
- smoothAnimations(element);
- }
- element[isMoving] = true;
2. 魔术字符串
魔术字符串指的是在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。
魔术字符串不利于修改和维护,风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。
- // 例子 4-1
- // bad
- const TYPE_AUDIO = 'AUDIO'
- const TYPE_VIDEO = 'VIDEO'
- const TYPE_IMAGE = 'IMAGE'
- // good
- const TYPE_AUDIO = Symbol()
- const TYPE_VIDEO = Symbol()
- const TYPE_IMAGE = Symbol()
- function handleFileResource(resource) {
- switch(resource.type) {
- case TYPE_AUDIO:
- playAudio(resource)
- break
- case TYPE_VIDEO:
- playVideo(resource)
- break
- case TYPE_IMAGE:
- previewImage(resource)
- break
- default:
- throw new Error('Unknown type of resource')
- }
- }
3. 私有变量
Symbol 也可以用于私有变量的实现。
- // 例子 4-3
- const Example = (function() {
- var _private = Symbol('private');
- class Example {
- constructor() {
- this[_private] = 'private';
- }
- getName() {
- return this[_private];
- }
- }
- return Example;
- })();
- var ex = new Example();
- console.log(ex.getName()); // private
- console.log(ex.name); // undefined