decko
decko copied to clipboard
@bind decorator bug when super method is called
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
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.
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.
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.
@memoize also not working when super class' method is called.
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