On Jun 21, 2012, at 8:48 AM, David Bruant wrote:
> Hi,
>
> I have read the recent "Subclassing" Built-in Constructors" page [1] and I
> have some feedback.
Well, that page is still is work in progress. But you feedback is still
appreciated.
> This page exhibits a distinction that wasn't clear in my mind before reading
> it: some internal properties can be added lazily like the ones for dates
> while some (essential internal methods) cannot.
Yes, but mainly for implementation reasons. At least of the essential internal
properties are used so frequently that their implementation must be highly
optimized. Lazy updates to them may still be possible but are likely to have
deep implementation impacts with performance implications.
>
> class MyDate extends Date {
> constructor(...args) {
> // |this| has no internal date property
> super();
> // now it does have them and can be considered as a date object,
> [[NativeBrand]] aside
> }
> }
>
> For constructor of objects that only add internal data properties and
> additional internal method (like RegExps [[Match]]), this can work fine.
> However, for objects with different essential internal methods, it cannot
> work.
Now you're into the part of the document I haven't finished editing...
>
> class MyArray extends Array {
> constructor(...args){
> // |this| not an array until i've called super(), right?
> 'length' in this; // false
> this[2] = "yo";
> this.length = 1; // ? I guess nothing happens except that |this|
> has a new 'length' property?
> super(); // If nothing serious happens, the array invariant is
> broken.
> this[2] // ?
> this.length // ?
> }
> }
>
> I don't think there is a way out unless |this| is already an array in which
> case 'super' is useless.
Well, the validity of any invariants over MyArray are actually the
responsibility of its implementors. But, if Array's constructor is defined
carefully generally things happen. Remember there is actually nothing special
about the 'length' property of an Array. It's the array [[DefineOwnProperty]]
internal method is special. One of the things it does is delete array elements
when the value of 'length' is decreased. So for the above scenario if Array
constructor was defined with these steps:
1 Set the [[DefineOwnProperty]] internal method of the this value to the
special array version.
2 Call the [[Put]] internal method of the this object with arguments
'length' and 0.
3 ...
at step 2 ([[Put]] actually delegates to [[DefineOwnPropety]] ) any elements
between 0 and the current length would get deleted and the length would set to
0. That would still leave element 2 around, but that element would be ignore
by any other array processing algorithms that depend upon length. Note that
it is already possible for an Array to inherit numerically indexed properties
whose indices are beyond the array length so there is no invariant that all
visible array index properties keys are within the length bounds.
But, in this case, I think the main thing is that we can't prevent developers
from coding crap. If they do, it really is their problem as long is we
guarantee memory safety.
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss