I prefer the object-oriented syntax
1) There's nothing more or less "object-oriented" about the syntax.
2) This isn't just a matter of syntax.
oMap.__get := ... creates a value property which can be overwritten by assigning __get again.
oMap.DefineProp('__get', { call: ... }) defines a
method which cannot be overwritten by assignment.
oMap.Get is a built-in function which takes two parameters: Key, Default.
(this, p*) => this.get(p*) is a user-defined function which takes a variable number of parameters and just calls the built-in method. It is useless overhead (in this example).
If the meta-function was defined for Map.Prototype or in a Map subclass and it called
this.get(p*), it would potentially call a Get method defined by a subclass of that class. That could be a benefit.
None of the implementations above are
correct, because the usage of __Get and Get do not match.
oMap.Blue will return an empty Array.
oMap.Blue[1] will return an array of parameters; i.e.
[1], which coincidentally looks the same as the indexer syntax.
Meta-functions have a fixed number of parameters, with the second parameter being the
[parameters*] (an Array), which is always passed. The point is that the meta-function is
required to handle the parameters, otherwise they would be ignored. Obviously, it's possible to circumvent that requirement by incorrectly using the variadic syntax.