Hi, This proposal is another attempt to address the DOM Element+EventTarget multiple inheritance issue in ECMAScript.
The main idea of my proposal is to introduce the concept of "object equivalence classes". First off, I'd like to say that I refer to a concept (http://en.wikipedia.org/wiki/Equivalence_class) which has nothing to do whatsoever with "classes" understood in a programming language inheritance context. The idea is to turn the == operator into an equivalence relation operator. The careful reader will instantly notice that actually, it already is (even if not explicitly stated in the spec). But the equivalence classes only contain one element each. So, the actual idea is to provide a mecanism to add new objects in an existing equivalence class. Each object would then have: - An identity (discriminable with ===) - An equivalence class (discriminable with ==) For the same reason Proxies shouldn't be able to redefine behavior of existing objects, the mechanism I'd like to introduce should not be able to change the equivalence class of an existing object. So, for the rest of this message, I'll expand my equivalence classes doing the following: --- // Assuming o is an object already in the environment var o2 = Object.create(null, {}, o); // third argument is an object // The newly created object and o will be in the same equivalence class // If the third argument is omitted, the new object belongs to a new equivalence class. --- We have: - o2 == o - o2 !== o - For all object a: o2 == a iff o == a (by transitivity by is in the definition of an equivalence class) __Implementing Element+EventTarget multiple inheritance__ Some properties we'd like to consider solving the problem. We'd like an object o such that: - o instanceof Element === true - o instanceof EventTarget === true - The built-in Element.prototype object is NOT in the built-in EventTarget prototype chain and vice versa Imagining that "instanceof", was checking for object equivalence (==) (instead of same object reference, ===), then we could do the following (siblinghood is used as a metaphor for belonging in the same equivalence class): --- var ElementProtoSibling = Object.create(null, {}, Element.prototype); var EventTargetProtoSibling = Object.create(ElementProtoSibling, {}, EventTarget.prototype); var e = Object.create(EventTargetProtoSibling, {}); --- We have: - e instanceof Element === true - e instanceof EventTarget === true These stand because instanceof would test equivalence instead of strict equality If, instead of creating empty new objects, ElementProtoSibling and EventTargetProtoSibling were "own forwarding proxies" (concept explained here: https://mail.mozilla.org/pipermail/es-discuss/2011-March/013361.html) to respectively Element.prototype and EventTarget.prototype, then e would inherit from these objects the way we expect it to. (Of course, some notation would need to be introduce so that proxies can be added to an existing equivalence class. Proxy.create(handler, proto, eqClassObject)?) __Backward compatibility issues__ None for pure ECMAScript programs (since, as said, equivalence classes already exists but only contain one element by construction). There are going to be issues if current code using the DOM tests non-strict equality (==) after calls to Object.getPrototypeOf. But since DOM prototypes are the mess we're trying to get standardized in WebIDL, it may not be that big of a deal. __Implementation considerations__ This proposal affects Object initialisation and == testing. I don't see big issues in implementing equivalence classes in both time and space for these aspects. __Relationship to other parts of the spec__ If this proposal was considered, it might be worth checking all places in the spec where there is a strict comparison (same reference). Maybe that these tests could benefit from the definition of equivalence classes instead like instanceof do (as I propose). David _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss