decko icon indicating copy to clipboard operation
decko copied to clipboard

@bind decorator bug when super method is called

Open precious opened this issue 8 years ago • 5 comments
trafficstars

This snippet demonstrates that the bind decorator does not work correctly on second method call if that method invokes super method which in turn is also decorated:

class A {
    @bind
    f() {
        console.log('I\'m A.f');
    }
}

class B extends A {
    @bind
    f() {
        console.log('I\'m B.f BEGIN');
        super.f();
        console.log('I\'m B.f END');
    }
}

let b = new B();
console.log('call b.f() 1st time:');
b.f();
console.log('call b.f() 2nd time:');
b.f();

Output:

call b.f() 1st time:
I'm B.f BEGIN
I'm A.f
I'm B.f END
call b.f() 2nd time:
I'm A.f

precious avatar Aug 31 '17 21:08 precious

This bug can be reproduced with babel es2015 preset. With .babelrc config

{"presets": ["es2015"], "plugins": ["transform-decorators-legacy"]}

and mocha option --compilers js:babel-core/register.

precious avatar Sep 02 '17 21:09 precious

Hmm interesting. I've never used this with prototypal inheritance, I can see how it'd overwrite itself like that. Not sure what the best solution for this would be, seems like any fix would break the lazy-binding behavior, which is sortof the big selling feature of this method.

developit avatar Sep 02 '17 21:09 developit

This fix may help. It prevents defineProperty for this if property is accessed from a super class. Let me know if this solution is acceptable -- I'll create a pull request.

precious avatar Sep 03 '17 01:09 precious

@memoize also not working when super class' method is called.

wy193777 avatar Apr 13 '18 18:04 wy193777

How does the example even work? When I run it, I get an error:

Cannot set property f of #<B> which has only a getter

Finesse avatar Feb 04 '19 09:02 Finesse