On Feb 17, 2011, at 12:17 AM, Dmitry A. Soshnikov wrote:

> 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).

No, assignment that would shadow a readonly prototype-property in ES1-3 was a 
silent failure. See 8.6.2.3 [[CanPut]] and 8.6.2.2 [[Put]].

/be


> 
> 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
>>> 
>>> 
>>> On Thu, Feb 17, 2011 at 02:21, Allen Wirfs-Brock <[email protected]> 
>>> 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
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>> 
>>> 
>> 
>> 
>> _______________________________________________
>> es-discuss mailing list
>> 
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to