Hi, Please excuse me if this will sound too crazy, but this idea have being growing in my head for so long that I can't stop myself from proposing it here. I have experimented many different ways of doing inheritance in JS:
1. Starting with a simple sugar that reduces machinery involved, similar to backbone.js https://github.com/Gozala/extendables 2. Finishing with class free prototypal inheritance https://github.com/Gozala/selfish I have to say that experience with selfish turned out very interesting, it made things so much simpler no special forms, no twisted relations between constructors and objects, just a plain objects. Most of these things are not obvious until you start using them, but the fact that exemplars (classes) are no different from regular objects in the system makes things much simpler. That being said I have also came to realize that in most of the cases functions as exemplars would be a better feet than objects. As a matter of fact if objects could be made callable I think it could could have replaced most of the things that classes are targeting in more elegant way. Here is more or less what I have in mind: https://gist.github.com/2295048 // class var Point = { (x, y) { this.getX = { () { return x; } } this.getY = { () { return x; } } } toString() { return '<' + this.getX() + ',' + this.getY() + '>'; } } var a = new Point(0, 0) var b = new Point(1, 7) // Examples from class proposal // extend is like create with a diff that second arg is an object. var SkinnedMesh = Object.extend(THREE.Mesh, { (geometry, materials) { // call the superclass constructor THREE.Mesh.call(this, geometry, materials); // initialize instance properties this.identityMatrix = new THREE.Matrix4(); this.bones = []; this.boneMatrices = []; // ... } update (camera) { THREE.Mesh.update.call(this); } }); Also such callable objects provide shorter alternative to current function syntax: // shorter than function numbers. filter({ (x) { return x % 2 } }). // maybe single expression can be even shorter like arrow functions ? map({ (x) x * x }). forEach({ (x) { this.add(x) } }, that); Also this would allow interesting APIs similar to those found in clojure: // maps / sets similar like in clojure ? var map = WeakMap(), key = {}, value = {}; map.set(key, value); map(key) // => value key(map) // => value And maybe built-ins could have it for doing `[]` work: // Maybe even non-magical replacement for `[]` [ 'a', 'b', 'c' ](1) // => 'b' ({ a: 1, b: 2 })('a') // => 1 ('b')({ a: 1, b: 2 }) // => 2 Regards -- Irakli Gozalishvili Web: http://www.jeditoolkit.com/
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

