Question regarding ES5

Dmitry A. Soshnikov dmitry.soshnikov at gmail.com
Thu Feb 17 00:17:39 PST 2011


Very strange behavior. What's the rationale? To avoid a shadowing? To 
avoid typo-errors -- i.e. if a user uses assignment it may be 
occasionally and if he uses Object.defineProperty -- he really wants to 
do it? Looks inconsistently. Assignment always affected an own property 
(only if the property isn't an accessor, then of course it affects the 
parent object).

Dmitry.

On 17.02.2011 5:02, Allen Wirfs-Brock wrote:
> They can be over-ridden by Object.defineOwnProperty.  they cannot be 
> over-ridden by assignment.  See ES5 [[CanPut]] specification 8.12.4. 
> step 8.b
>
> On Feb 16, 2011, at 5:32 PM, Irakli Gozalishvili wrote:
>
>> Thanks for the reply Allen,
>>
>> I was under the impression that inherited properties can be 
>> overridden, regardless of their write-ability on the __proto__.
>>
>> Also as far as I understand freeze will make properties including 
>> constructor non-confugurable, will I still be able  to override such 
>> properties using Object.defineProperty ?
>>
>> Also this was simplified example and it's not really possible to do 
>> the freeze after. Will try `Object.defineProprety` though.
>>
>> Thanks
>> --
>> Irakli Gozalishvili
>> Web: http://www.jeditoolkit.com/
>> Address: 29 Rue Saint-Georges, 75009 Paris, France 
>> <http://goo.gl/maps/3CHu>
>>
>>
>> On Thu, Feb 17, 2011 at 02:21, Allen Wirfs-Brock 
>> <allen at wirfs-brock.com <mailto:allen at wirfs-brock.com>> wrote:
>>
>>     The error looks correct to me. By freezing Type.proto you make
>>     all its own properties "read only".  One of those is the
>>     constructor that is automatically created on every func.prototype
>>     object.  When you assign to object.constructor you are trying to
>>     over-ride an inherited read-onoy property.  ECMAScript has never
>>     allowed this.  You can say:
>>           Object.defineProperty(object,"constructor",{value: function
>>     Foo() {}, /* any other attributes you want to set */});
>>     to over-ride the inherited constructor property.
>>     Or you can restructure you code so you do the freeze after you do
>>     the assignment.
>>
>>     On Feb 16, 2011, at 5:09 PM, Irakli Gozalishvili wrote:
>>
>>>     Hi,
>>>
>>>     I've run into one issue and even after reading ES5 specs several
>>>     times it's not clear to me what should be an expected behavior:
>>>
>>>     Currently on Firefox nightly following code:
>>>
>>>     (function() {
>>>     "use strict";
>>>
>>>     function Type() {}
>>>     Object.freeze(Type.prototype);
>>>     var object = Object.create(Type.prototype);
>>>     object.constructor = function Foo() {};
>>>
>>>     return object
>>>     })();
>>>
>>>     throws TypeError: object.constructor is read-only
>>>     while on chrome
>>>
>>>     it returns object with constructor Foo
>>>
>>>     I would like to know what is an expected behavior to fill a bug
>>>     to an appropriate project.
>>>
>>>
>>>     Thanks!
>>>     --
>>>     Irakli Gozalishvili
>>>     Web: http://www.jeditoolkit.com/
>>>     Address: 29 Rue Saint-Georges, 75009 Paris, France
>>>     <http://goo.gl/maps/3CHu>
>>>     _______________________________________________
>>>     es-discuss mailing list
>>>     es-discuss at mozilla.org <mailto: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/20110217/56ea617f/attachment.html>


More information about the es-discuss mailing list