<p dir="ltr">I would like to point out that this particular example could be done in terms of existing proxies now:</p>
<p dir="ltr">```js<br>
var sttFunc = new Proxy({}, {<br>
    get(target, key) {<br>
        console.log("get: [", key, "]");<br>
        return key;<br>
    },<br>
    set(target, key, value) {<br>
        console.log("set: [", key, "] = ", val);<br>
        return true; // success<br>
    }<br>
});</p>
<p dir="ltr">// Usage:<br>
sttFunc["key"] = "value"; // set: [key] = value<br>
sttFunc["key"]; // get: [key]<br>
```</p>
<br><div class="gmail_quote"><div dir="ltr">On Thu, May 12, 2016, 15:02 Jason Orendorff <<a href="mailto:jason.orendorff@gmail.com">jason.orendorff@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The nice thing about @@symbol-named methods is that we *don't* have to<br>
extend the Proxy API for them. They're just method calls.<br>
<br>
This is why there's no hasInstance Proxy trap. `instanceof` basically<br>
boils down to a method call, and we already have Proxy traps for<br>
method calls: `get` and `apply`.<br>
<br>
It's a good thing, too, because adding a new Proxy trap is a last<br>
resort. Just from a conceptual standpoint, the less complicated<br>
objects are, the better; just because there are 14 *fundamental*<br>
operations on objects doesn't mean we're eager to add more. But<br>
there's also an inherent compatibility issue. Whenever you add a new<br>
trap, the deal is, all existing Proxy handlers were written without<br>
consideration for the new operation. So old code, used in combination<br>
with the new language feature, would tend to break.<br>
<br>
Cheers,<br>
-j<br>
<br>
<br>
On Thu, May 12, 2016 at 9:42 AM, Igor Baklan <<a href="mailto:io.baklan@gmail.com" target="_blank">io.baklan@gmail.com</a>> wrote:<br>
> It would be nice to "bring sense" to expressions like "obj(a1, ... , aN) =<br>
> val".  (like "obj(x)  = y")<br>
> In Scala langue it defined in pretty clear and simple way:<br>
><br>
>    "obj(a1, ... , aN)" <==> "obj.apply(a1, ... , aN)"<br>
>    "obj(a1, ... , an) = val" <==> "obj.update(a1, ... , aN, val)"<br>
><br>
> Of course this applied only to that cases when obj was not defined like<br>
> method (in case of regular methods "mth(args) = val" will cause compile time<br>
> error).<br>
> So in Scala even arrays and maps are accessed and updated using "()"<br>
> operator<br>
><br>
>    js( arr[index] = val ) <==> scala( arr(index) = val )<br>
><br>
> (see <a href="http://www.scala-lang.org/api/2.10.0/index.html#scala.Array" rel="noreferrer" target="_blank">http://www.scala-lang.org/api/2.10.0/index.html#scala.Array</a> ,<br>
> <a href="http://docs.scala-lang.org/overviews/collections/maps#operations-in-class-mutablemap" rel="noreferrer" target="_blank">http://docs.scala-lang.org/overviews/collections/maps#operations-in-class-mutablemap</a><br>
> , etc)<br>
><br>
> So the proposals are:<br>
><br>
> (1) to introduce symbols like @@apply and @@update with very similar to<br>
> Scala meaning (for cases when 'obj.sttFunc' is not a function)<br>
><br>
>   "obj.sttFunc(a1, ... , aN) = val" ==> "obj.sttFunc[Symbol.update]<br>
> (obj.sttFunc, obj, [a1, ... , aN], val)"<br>
>   "obj.sttFunc(a1, ... , aN)" ==> "obj.sttFunc[Symbol.apply] (obj.sttFunc,<br>
> obj, [a1, ... , aN])"<br>
><br>
> (2) to extend Prxoy object specification to support update action along with<br>
> apply action:<br>
><br>
> I would like to write something similar to<br>
><br>
> var target = {<br>
>    jsApply: function(key){<br>
>       console.log("apply: ", key);<br>
>       return key;<br>
>    },<br>
>    jsUpdate: function(key, val){<br>
>       console.log("update: (", key, ") = ", val);<br>
>       return val;<br>
>    }<br>
> };<br>
> var sttFunc = new Proxy(target, {<br>
>    apply: function(target, thisArg, argumentsList) {<br>
>       target.jsApply.apply(thisArg, argumentsList);<br>
>    },<br>
>    update:  function(target, thisArg, argumentsList, assignValue) {<br>
>       target.jsApply.apply(thisArg,<br>
> Array.from(argumentsList).concat([assignValue]));<br>
>    }<br>
> });<br>
><br>
> And then run it as following<br>
><br>
>> sttFunc ("key") = "value";<br>
><br>
> update: ( key ) =  value<br>
><br>
>> sttFunc ("key");<br>
><br>
> apply:  key<br>
> "key"<br>
><br>
><br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> <a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
> <a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
><br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>