4. Symbol

1. 唯一值

  1. // 例子 4-1
  2.  
  3.  
  4. // bad
  5. // 1. 创建的属性会被 for-in 或 Object.keys() 枚举出来
  6. // 2. 一些库可能在将来会使用同样的方式,这会与你的代码发生冲突
  7. if (element.isMoving) {
  8. smoothAnimations(element);
  9. }
  10. element.isMoving = true;
  11.  
  12. // good
  13. if (element.__$jorendorff_animation_library$PLEASE_DO_NOT_USE_THIS_PROPERTY$isMoving__) {
  14. smoothAnimations(element);
  15. }
  16. element.__$jorendorff_animation_library$PLEASE_DO_NOT_USE_THIS_PROPERTY$isMoving__ = true;
  17.  
  18. // better
  19. var isMoving = Symbol("isMoving");
  20.  
  21. ...
  22.  
  23. if (element[isMoving]) {
  24. smoothAnimations(element);
  25. }
  26. element[isMoving] = true;

2. 魔术字符串

魔术字符串指的是在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。

魔术字符串不利于修改和维护,风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。

  1. // 例子 4-1
  2.  
  3. // bad
  4. const TYPE_AUDIO = 'AUDIO'
  5. const TYPE_VIDEO = 'VIDEO'
  6. const TYPE_IMAGE = 'IMAGE'
  7.  
  8. // good
  9. const TYPE_AUDIO = Symbol()
  10. const TYPE_VIDEO = Symbol()
  11. const TYPE_IMAGE = Symbol()
  12.  
  13. function handleFileResource(resource) {
  14. switch(resource.type) {
  15. case TYPE_AUDIO:
  16. playAudio(resource)
  17. break
  18. case TYPE_VIDEO:
  19. playVideo(resource)
  20. break
  21. case TYPE_IMAGE:
  22. previewImage(resource)
  23. break
  24. default:
  25. throw new Error('Unknown type of resource')
  26. }
  27. }

3. 私有变量

Symbol 也可以用于私有变量的实现。

  1. // 例子 4-3
  2.  
  3. const Example = (function() {
  4. var _private = Symbol('private');
  5.  
  6. class Example {
  7. constructor() {
  8. this[_private] = 'private';
  9. }
  10. getName() {
  11. return this[_private];
  12. }
  13. }
  14.  
  15. return Example;
  16. })();
  17.  
  18. var ex = new Example();
  19.  
  20. console.log(ex.getName()); // private
  21. console.log(ex.name); // undefined