B.3.1 The __proto__ pseudo property

Allen Wirfs-Brock allen at wirfs-brock.com
Sun Apr 21 13:16:28 PDT 2013


On Apr 21, 2013, at 12:31 PM, Brendan Eich wrote:

> Allen Wirfs-Brock wrote:
>> On Apr 21, 2013, at 12:05 PM, Brendan Eich wrote:
>> 
>>>>> What I mean is that:
>>>>>     let obj = {__proto__: null}
>>>>> will always create an object whose [[Prototype]]
>>> Didn't you mean "an object whose property named '__proto__'" here?
>>> 
>>>>> is null.  Regardless of whether or not anybody has done:
>>>>>    delete Object.prototype.__proto__.
>>>> Yes, that's what I just wrote!
>>>> 
>>>> What part was unclear?
>>> Sorry, I misread your "[[Prototype]] is null" as "property named '__proto__' is null".
>>> 
>>> But you cannot break ES5. Why are you changing things to deviate from it, never mind from ES6 consensus?
>>> 
>> 
>> We must be talking across each other...web reality is that
>>    var obj = {__proto__: someObj};
>> 
>> creates a new object whose [[Prototype]] is the value of someObj (assuming it is valid for that use).  Right?
> 
> Argh, you're right. I'm wrong, the de-facto standard wants [[Put]] not [[DefineOwnProperty]] and that's what ES5 specified.
> 
> I plead jetlag and throw myself on the mercy of the court!

Suspended sentence...and I really should be finishing preparing for my own European speaking trip rather than being sucked into this dismal mess...

> 
>>   Doesn't that mean that ES5 implementations that support that semantics already deviate from the ES5 spec which says that an own property named "__proto__" should be created via [[DefineOwnProperty]]?
> 
> That follows.
> 
> However, let's get back to (a) coffee :-); (b) ES6 and the ability to delete Object.prototype.__proto__.
> 
> You don't want that to affect object literals evaluated in the same realm after such a deletion. Why not?

Why should it?  We already used the existence of {__proto__: whatever} got rid of  <| as declarative syntax for defining an object literal with a [[Prototype]] other than object prototype.  Making {__proto__: whatever}  only work some of the times means it isn't a reliable declarative syntax.  Why would we want to do that?  There is arguably a good motivation wanting disable the ability to dynamically __proto__ modify arbitrary pare-existing objects. But what is the motifacation for doing that on newly created objects?  

> 
> SpiderMonkey at least goes out of its way to do [[Set]] (let's call it) not [[DefineOwnProperty]] for 'o = {__proto__: 42}', so why wouldn't [[Set]] create a fresh property, seeing nothing on Object.prototype named '__proto__' with a setter to run?

Because the semantics that says you can't use [[DefineOwnProperty]] may say to go out of the way to do something else.  It my strawman spec. it says use [[SetInhertiance]] rather than [[Put]].  Either is a special case semantics and [[SetInheritance]] is a much more direct expression of the likely user intent. 

Allen




More information about the es-discuss mailing list