Note that "this" always points to where the search for a method starts (the “receiver” of the method call), there (current) beginning of the prototype chain. "here" points to where a method has been found. This is a static aspect, except that turning it into a property of a function would make it impossible to put the same function into multiple objects.
>> Then >> super.foo(x, y) >> would desugar to >> Object.getPrototypeOf(here).foo.call(this, x, y) >> >> With call() and apply(), you would have here === this. > > When the prototype chain is three or more objects long, I'm wondering > what would happen. > > With "here" I'd expect and think people would expect the following > behavior (but I don't think it is what your proposal of "here" would > do.) > > function Alpha() {} > Alpha.prototype.one = function() {return 'Alpha.one';}; > Alpha.prototype.two = function() {return 'Alpha.two';}; > Alpha.prototype.three = function() {return super.one() + ' ' + > here.one() + ' ' + this.one();}; > > function Beta() {} > Beta.prototype = Object.create(Alpha.prototype); > Beta.prototype.one = function() {return 'Beta.one';}; > Beta.prototype.two = function() {return super.one() + ' ' + here.one() > + ' ' + this.one();}; > > function Gamma() {} > Gamma.prototype = Object.create(Beta.prototype); > Gamma.prototype.three = function() {return super.one() + ' ' + > here.one() + ' ' + this.one();}; > > var a = new Alpha(); > var b = new Beta(); > var g = new Gamma(); Wow, quite a puzzle. I hope I get it right: > a.three(); // "Alpha.one Alpha.one Alpha.one" super.one() would cause an exception, because method "three" is found in Alpha.prototype (=> becomes "here") whose prototype is Object.prototype, which does not have a method one(). > b.two(); // "Alpha.one Beta.one Beta.one" Would work. The search for super.one() would start in Alpha.prototype, the search for here.one() would start in Beta.prototype, the search four this.one() would also start in Beta.prototype. > g.two(); // "Alpha.one Beta.one Gamma.one" Is OK, only "this" is different, "here" is still Beta.prototype. > g.three(); // "Beta.one Gamma.one Gamma.one" I dont’t see "Gamma.one" anywhere. I would say: "Beta.one Beta.one Beta.one" Maybe you can condense this into a simpler example that gets to the core of where you think things might be tricky. -- Dr. Axel Rauschmayer a...@rauschma.de twitter.com/rauschma home: rauschma.de blog: 2ality.com _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss