I''ve been a bit pinch for time the last couple days, but here are some 
preliminary responses to a few points below.

On Apr 5, 2011, at 1:38 PM, David Bruant wrote:

>> On Apr 2, 2011, at 5:11 PM, Brendan Eich wrote  (except the this is really 
>> quoting Allen Wirfs-Brock):
>>> 
>> Inheritance-based instanceof testing for the purpose of dynamic 
>> classification of objects  is most appropriate in statically typed 
>> subclasing===subtyping languages.  Multiple inheritance (at least for 
>> interfaces) is almost essential in such languages.  That isn't is the case 
>> for dynamically typed subclassing!==subtyping languages.  There is lots of 
>> experience with such languages that shows that dynamic classification via 
>> class or superclass inclusion testing is a poor practice.  This is because 
>> it is possible (and often even necessary) to create behaviorally 
>> substitutable  classes that don't participate in an inheritance 
>> relationship.  By using such a test you are forcing downstream developers to 
>> fit into your implementation hierarchy and there may be strong reasons to do 
>> otherwise.
> I am highly interested by all what is in this paragraph. Would you have
> articles talking about that you could refer me to?

Much of the technology and best practices of object-oriented design were 
developed in the 1990's in the context of developing complex applications and 
frameworks using Smalltalk. a dynamically typed, single inheritance class based 
language.  There is a large body of work on this topic although most of it is 
in the guise of Smalltalk. A good resource is 
http://stephane.ducasse.free.fr/FreeBooks.html which has digitized copies of a 
number of out of print Smalltalk related books.  Pay particular attention to 
the style guides and patterns related books.  You can probably skip the parts 
the address specific Smalltalk programming idioms (and pitfalls) but pay 
attention to the parts that are more directly generalizable to other dynamic 
languages.  A highly regarded book that isn't on this site is Kent Beck's 
Smalltalk Best Practices Patterns.  However, with some web searching you may be 
able to find prepub. drafts that are still floating around the web.

For books and articles about OO design methods that were highly influenced by 
Smalltalk best practices see the work of the other Wirfs-Brock:   
http://wirfs-brock.com/Resources.html  For a book length treatment read: Object 
Design: Roles, Responsibilities, and Collaborations.

Lots of other stuff on the web if you search. 


> 
>> 
>> instanceof testing is very familiar to programmers coming from a Java-like 
>> language background.  But like a number of other statically-typed language 
>> practices, instanceof testing is not a good idiom to use in JavaScript.  If 
>> an "EventTarget" must have specific behavioral characteristic, then define 
>> those characteristics such that any object that needs to be an "EventTarget" 
>> can implement them, regardless of what is on its [[Prototype]] chain.  If it 
>> is important to be able to dynamically test if an object can serve as an 
>> "EventTarget" then define a property that provides that characterization and 
>> make it part of the specified behavior of an "EventTarget". Just don't 
>> require that EventTarget.prototype is somewhere on the [[Prototype]] chain.
> So in a way, are you saying that the DOMCore/WebIDL decision is a bad one?
> If so, how would you solve the Element+EventTarget problem?

The EventTarget interface specifies 3 methods addEventListner, 
removeEventListener, and  dispatchEvent.  Any object that implements these 
three methods in conformance to the appropriate DOM spec.  conforms to this 
interface.  It doesn't matter if the implementation was  inherited or directly 
implemented on the object.  The method that seems to be most essential is 
dispatchEvent.  If I need to test if an object is an EventTarget, I would do it 
by:
    if (obj.dispatchEvent) {/* this is an event listener */ ...

If you are afraid that somebody might coincidentally implement a method named 
"dispatchEvent"  define a function:
function isEventTarget(obj) {return (obj.isDispatchEvent && obj.addEventListner 
&& obj.removeEventListner0 ? true: false)}
//personally, I'd seldom, if ever, go to that extreme

> 
> One interesting aspect I see in having all the things you inherit from
> in the [[Prototype]] chain is that you may be able to communicate with
> all other instances in a way. It may be a completely stupid idea, I
> don't know.

Finding all instances is typically an expensive operations that requires 
runtime support.  It is seldom needed.  If you find that you do need it, it is 
probably a good idea to go back and revisit the design decisions that led to 
the necessity.

Allen

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to