在使用 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)
==========================================================
下面是动画演示: