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

