Question regarding ES5

Mark S. Miller erights at google.com
Wed Feb 16 20:20:34 PST 2011


On Wed, Feb 16, 2011 at 8:07 PM, Oliver Hunt <oliver at apple.com> wrote:

> This behaviour seems to result in undesirable behaviour in conjunction with
> object literals:
>
> Object.defineProperty(Object.prototype, "foo", {value:"bar"});
>
> "use strict"; var someObject = {foo:"wibble"}
>
> Will now throw.
>

It should not throw, since ES5 object and array literals are defined in
terms of [[DefineOwnProperty]] rather than [[Put]]. This is a change from
ES3.

Just tested, and FF4 beta has the right behavior in both cases: throwing on
assignment and not on object literals. Neither Chrome nor Safari throw in
either case.


>
> --Oliver
>
> On Feb 16, 2011, at 6:02 PM, 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>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
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>>
>>
>
> _______________________________________________
> 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
>
>


-- 
    Cheers,
    --MarkM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20110216/d9a4084e/attachment.html>


More information about the es-discuss mailing list