Javascript 重构小技巧 一则

在使用 Google Closure Compiler的时候,如果是外部的数据,在访问这个对象的属性的时候,需要使用 obj['prop1'] 这种方式,而不能使用 obj.prop1

经常会遇到一种情况,开发的时候写成了 obj.prop1, 需要手动修改成 obj['prop1']

这两种对象属性访问方式最好是可以相互转换就好了,看了一个 js2-refactor 的代码,自己写了一个,用着还不错。分享给有需要的朋友。(PS. 依赖 js2-mode 和 js2-refactor)

(defun js2r-toggle-object-property-access-style ()
  "Toggle js object property access style."
  (interactive)
  (js2r--guard)
  (js2r--wait-for-parse
   (save-excursion
     (let ((node (js2-node-at-point)))
       (if (js2-string-node-p node)
           (let* ((start (js2-node-abs-pos node))
                  (end (+ start (js2-node-len node))))
             (when (memq (char-before start) '(?\[))
               (save-excursion
                 (goto-char (-  end 1)) (delete-char 2)
                 (goto-char (+ start 1)) (delete-char -2) (insert "."))))
         (let* ((start (js2-node-abs-pos node))
                (end (+ start (js2-node-len node))))
           (when (memq (char-before start) '(?.))
             (save-excursion
               (goto-char end) (insert "\']")
               (goto-char start) (delete-char -1) (insert "[\'")))))))))


我用的 spacemacs, 绑定的快捷键为 SPC m r . (a.k.a ,r.)

(spacemacs/set-leader-keys-for-major-mode 'js2-mode
      "r." 'js2r-toggle-object-property-access-style)

==========================================================

下面是动画演示:

js2-refactor

4 个赞

让我想起来之前把foo_bar改成fooBar都是手动改,后来发现有个string-inflection的包,什么都给我写好了 :joy:

另外手持web-mode羡慕你们用js2-mode的……

1 个赞

有用 thx