specify!
隐式依赖提供的对象可扩展,以便提供协议实现。以下是一个来自 REPL 的快速演示。
cljs.user> (def obj #js {:current nil})
[#js {:current nil}]
cljs.user> (js/Object.preventExtensions obj)
{"current" nil}
cljs.user> (specify! obj
IDeref
(-deref [^js this] (.-current this)))
{"current" nil}
请注意,reify
也没有对这个要求进行文档说明。这导致了一些令人困惑的情况,例如由 JavaScript 库(例如 React)返回的非可扩展对象无法扩展,用户对此几乎一无所知。
类似地,当对象不可扩展时,set!
会静默失败。
cljs.user> (set! (.-foo obj) "bar")
"bar"
cljs.user> obj
{"current" nil}
goog.object/set
能够检测到这一点并抛出错误。
cljs.user> (goog.object/set obj "foo" "bar")
Execution error (TypeError) at (<cljs repl>:1).
Cannot add property foo, object is not extensible
:repl/exception!