Extending a protocol to one of the global JS objects is bad for the same reason
it is bad in Javascript: you are modifying a global object. Your
extend-protocol is like saying Function.prototype.FOO_foo = function(this,
arg){...} in javascript. (The "FOO_foo" is a long namespaced and mangled
property name, but you are still modifying the global.)
You can extend "function" (and "object", "number", "string", "array", and
"boolean") instead of js/Function (or js/Object, etc). This will implement the
protocol from the "outside" (doing type checks on its argument) instead of
assigning a new member to the global's prototype. E.g.:
(extend-protocol Foo
function
(foo [this] (println this)))
I'm not sure if you also need to extend IFn: I think "function" means only
native js functions and not clojurescript objects implementing IFn. (Test with
a multi-arity cljs function to verify.)
You can also extend the "default" type, which means everything will implement
the protocol that doesn't have a more specific implementation.
I don't know where these magic protocol type names are documented.
On Thursday, September 3, 2015 at 6:58:48 AM UTC-5, Scott Nelson wrote:
> (defprotocol Foo
> (foo [arg]))
>
> (extend-protocol Foo
> js/Function
> (foo [arg]
> (println arg)))
--
Note that posts from new members are moderated - please be patient with your
first post.
---
You received this message because you are subscribed to the Google Groups
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/clojurescript.