> class B {
> a() {
> this.b();
> }
> b() {
> print('B.b');
> }
> }
>
> class C extends B {
> a() {
> super.a();
> }
> b() {
> print('C.b');
> }
> }
>
> var c = new C;
> c.a(); // Should print 'C.b'
>
> With a dynamic super the above would lookup b in the wrong object
> (B.prototype instead of C.prototype).
Note that with dynamic super, "this" never changes during the following method
invocations, only "here" changes.
c.a() => this = c, here = C.prototype (where a() was found)
super.a() => this = c, here = B.prototype. Explanation for "here": a() was
found by searching the prototype chain, starting at the prototype of the
previous "here". Thus, the search starts at B.prototype where a property "a" is
found.
this.b() => this = c. The search for b() starts at "this" = c and finds a
property "b" in the prototype of c (which is C.prototype).
So it should work. It’s actually closer to the intuitive meaning of "super.a":
- Perform the invocation as if it was this.a (meaning that the value of "this"
is unchanged).
- But: start the search for "a" in the prototype of the object where the
current method "lives" (the "here" variable mentioned above).
super.a(arg1, arg2) => Object.getPrototypeOf(here).a.call(this, arg1, arg2)
--
Dr. Axel Rauschmayer
[email protected]
twitter.com/rauschma
home: rauschma.de
blog: 2ality.com
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss