setPrototypeOf vs obj.__proto__ assignment
Andrea Giammarchi
andrea.giammarchi at gmail.com
Mon Apr 7 10:51:10 PDT 2014
nope, if you have a dict and you use __proto__ nothing should happen,
that's why Object.setPrototypeOf is suggested: it's more powerful + it does
not show up in getOwnPropertyNames as '__proto__' does so it's shenanigans
and errors prone.
__proto__ is not even more elegant than Object.create(null) plus you can
use a piece of code that fits in a tweet to simplify its equivalent usage
when meant.
```javascript
var o = Object.setPrototypeOf(
{
// your literal object
},
Object.prototype // your inherited proto
);
```
wanna simplify that ? [here just an example](
https://gist.github.com/WebReflection/9900019)
```javascript
*var* O*=function*(O,s){s*=*O.setPrototypeOf*||function*(o,p){o.__proto__*=*
p;*return* o};*return* *function*(p,o){*return* o*?*s(o,p)*:*p*||*s({},p)}}(
Object);
var obj = O(null, {
// your literal Object
});
// same as
var obj = O(
Array.prototype,
{}
);
```
Most `__proto__` support is completely broken these days when it comes to
dictionaries ... since `{__proto__:null}.__proto__` still shows up and the
only fix is to `delete Object.prototype.__proto__` where possible, or reuse
its setter so simulate `Object.setPrototypeOf` when it's not poisoned.
All this has been discussed for years now ... it's surprising it's still
not clear why the explicit `Object.setPrototypeOf` is the preferred choice.
It feels like everyone uses `__proto__` on daily basis while ES6 promotes
classes ... so either `__proto__` is not a real world use case, or `class`
landed for no reason, IMO.
On Mon, Apr 7, 2014 at 8:53 AM, John Barton <johnjbarton at google.com> wrote:
> The context for my question was Tom van Cutsem's excellent Proxy shim,
> https://github.com/tvcutsem/harmony-reflect, which uses __proto__
> assignment to shim Object.setPrototypeOf. In developing Proxy code,
> objects and not classes are relevant. Directly manipulating the __proto__
> is vastly superior to any solution based on es6 classes or our unfortunate
> friend Object.create().
>
> jjb
>
>
> On Mon, Apr 7, 2014 at 2:34 AM, Axel Rauschmayer <axel at rauschma.de> wrote:
>
>> I like __proto__ in object literals, as a nicer Object.create(). In that
>> case, __proto__ is "the new <| operator" and really quite different from
>> __proto__ as a getter and a setter.
>>
>> I have two uses for it:
>>
>> - Dict pattern { __proto__: null, ... }
>> - To explain prototype chains to beginners (=> not something that would
>> be used in production code).
>>
>> If ECMAScript 6 didn't support classes and subclassing, it would help
>> with subclassing, too.
>>
>>
>>
>>
>> On Apr 7, 2014, at 11:05 , Andreas Rossberg <rossberg at google.com> wrote:
>>
>> > On 4 April 2014 19:49, Allen Wirfs-Brock <allen at wirfs-brock.com> wrote:
>> >> __proto__ is there for legacy compatibility.
>> >> setPrototypeOf should be preferred for new code
>> >
>> > For new code, neither should be used.
>> >
>> > /Andreas
>> > _______________________________________________
>> > es-discuss mailing list
>> > es-discuss at mozilla.org
>> > https://mail.mozilla.org/listinfo/es-discuss
>> >
>>
>> --
>> Dr. Axel Rauschmayer
>> axel at rauschma.de
>>
>> home: rauschma.de
>> twitter: twitter.com/rauschma
>> blog: 2ality.com
>>
>>
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140407/39fce094/attachment.html>
More information about the es-discuss
mailing list