ClojureScript 和 Closure:如何防止属性被 Closure 重命名

4
我正在尝试进行一些HTML5画布绘制,但在高级编译模式下遇到了问题。我想通过Mozilla浏览器的mozDash属性来说明这个问题(虽然此问题与属性优化功能有关),链接为:https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D#Gecko-specific_attributes 在Clojurescript中,javascript语句canvas.mozDash = ... 可以表示为[1](set! (.-mozDash canvas) ...) 或 [2] (aset canvas "mozDash" ...)
我之前使用过[1],大多数情况下都可以工作,但是对于mozDash属性,在高级编译结果中mozDash标识符已经消失了。因此,我尝试使用[2],似乎通过aset变量保留了mozDash标识符。
我的问题如下:
  • 这些符号之间的差异是否是有意的?
  • 为什么(.-fillStyle canvas)的行为不同([1]和[2]都有效)?
我怀疑默认情况下标准HTML属性是受保护的,而非标准属性(如mozDash)则不被支持。
1个回答

5
闭包编译器允许重命名未在外部或导出中指定的直接访问属性。
请参见https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames 具体来说,(aset x "y" z)被翻译为x["y"] = z,这是不受最小化影响的,而(set! (.-y x) z)被翻译为x.y = z,除非x.y被指定为外部或导出,否则可以被最小化。
我认为mozDash属性没有在您用于Canvas的外部文件中指定。

事实上,我也发现最近在邮件列表中有关于此的讨论,链接为https://groups.google.com/d/msg/clojurescript/uO3MLafNnZ4/G2D5PE6eoqQJ。 - wirrbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接