Igor Baklan (2016-05-12T14:42:35.000Z)
io.baklan at gmail.com (2016-05-12T15:28:04.372Z)
It would be nice to "bring sense" to expressions like ``obj(a1, ... , aN) = val``. (like ``obj(x) = y``) In Scala langue it defined in pretty clear and simple way: ``` "obj(a1, ... , aN)" <==> "obj.apply(a1, ... , aN)" "obj(a1, ... , an) = val" <==> "obj.update(a1, ... , aN, val)" ``` Of course this applied only to that cases when obj was not defined like method (in case of regular methods ``mth(args) = val`` will cause compile time error). So in Scala even arrays and maps are accessed and updated using "()" operator ``` js( arr[index] = val ) <==> scala( arr(index) = val ) ``` (see http://www.scala-lang.org/api/2.10.0/index.html#scala.Array , http://docs.scala-lang.org/overviews/collections/maps#operations-in-class-mutablemap , etc) **So the proposals are:** *(1)* to introduce symbols like ``@@apply`` and ``@@update`` with very similar to Scala meaning (for cases when ``obj.sttFunc`` is not a function) ``` "obj.sttFunc(a1, ... , aN) = val" ==> "obj.sttFunc[Symbol.update] (obj.sttFunc, obj, [a1, ... , aN], val)" "obj.sttFunc(a1, ... , aN)" ==> "obj.sttFunc[Symbol.apply] (obj.sttFunc, obj, [a1, ... , aN])" ``` *(2)* to extend *Prxoy* object specification to support *update* action along with *apply* action: I would like to write something similar to ``` var target = { jsApply: function(key){ console.log("apply: ", key); return key; }, jsUpdate: function(key, val){ console.log("update: (", key, ") = ", val); return val; } }; var sttFunc = new Proxy(target, { apply: function(target, thisArg, argumentsList) { target.jsApply.apply(thisArg, argumentsList); }, update: function(target, thisArg, argumentsList, assignValue) { target.jsApply.apply(thisArg, Array.from(argumentsList).concat([assignValue])); } }); ``` And then run it as following ``` > sttFunc ("key") = "value"; update: ( key ) = value > sttFunc ("key"); apply: key "key" ```