On Jul 9, 2007, at 12:10 PM, Jeff Dyer wrote:
class C { var x : String; }
c = new C;
function F() {}
F.prototype=c;
f = new F; // f.__proto__ = c
f.x =4;
If you do this c.x now equals "4", that is the value is not set
in f, but it goes up the prototype chain and sets 4 into x (and
does implicit conversion).
This behavior is incorrect. For compatibility with ES3, property
writes must be shallow.
Agreed, but the question is: how? If you say that f.hasOwnProperty
('x'), then what is the type constraint on that property's value? If
it is String, then how is it implemented given that new F creates an
Object instance, not a C instance?
One could imagine a fixture being added to each Object instance
created by new F. It would make the type of f be {x:String}, which is
compatible with C assuming you put 'public' in front of 'var
x' (that's necessary, otherwise the x in c is in C's internal
namespace -- please correct me if I have this wrong).
What's not allowed is an unconstrained slot on f -- that would break
type safety for methods of C that count on x being a String. What
also seems hard to believe in is some magic getter/setter pair in c
(f.__proto__) that lets x be stored in each instance (f) but enforces
the type constraint.
So when you wrote "This behavior is incorrect", did you have in mind
a fixture per instance, created on demand when assigning ("writes
must be shallow") to x where f.__proto__.x is a fixture defined by C?
I.e., a copy-on-write fixture due to the class of f differing (and
lacking any public::x of its own) from the class of c?
If you want x to be a delegated and override-able "plain old"
property, not a fixture, declare C thus:
class C { prototype var x : String; }
To be clear, in the example above this would put a expando property
‘x’ on ‘f.__proto__.__proto__’.
Yes, but it could be shadowed in f instances, inheriting the type
constraint.
See my comment before my last one. Making prototypes more like
classes would make them less flexible, more complicated, and
duplicate functionality that is already available. I don’t see the
point, but maybe I’m missing the use case.
Using functions as extra constructors may be a use-case, but the
primary problem is definitional: given functions and classes, what
*should* happen in Kris's example, and how should it be specified/
reference-implemented? Copy-on-write fixtures are a new thing under
our Sun, it seems to me.
/be
_______________________________________________
Es4-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es4-discuss