I am trying to overwrite the function of a class:
class MyClass {
constructor() {
// more code
}
myFunction = function() {
console.log('not this')
}
}
// can't change the code above
MyClass.prototype.myFunction = function() {
console.log('it should print this')
}
new MyClass().myFunction()
But Babel compiles the above to this:
class MyClass {
constructor() {
// more code
this.myFunction = function () {
console.log('not this');
};
}
}
// can't change the code above
MyClass.prototype.myFunction = function () {
console.log('it should print this');
};
new MyClass().myFunction();
Because the function is defined as a property in the original code, Babel puts that definition in the constructor. If I understand correctly prototype only contains functions, not all properties. Because the constructor runs after the object was derived from the prototype, I can't use the prototype to overwrite that function.
My second try was overwriting the constructor:
class MyClass {
constructor() {
// more code
}
myFunction = function () {
console.log('not this')
}
}
// can't change the code above
let oldConstructor = MyClass.prototype.constructor
MyClass.prototype.constructor = function() {
// call old constructor first, it will set myFunction
oldConstructor()
// now overwrite myFunction
this.myFunction = function () {
console.log('it should print this')
}
}
new MyClass().myFunction()
Well, let's try... Compile with Babel, save it to test.js and run:
~> node test.js
not this
I tried to make the question as general as possible. More background information on why I can't change the class in my specific case: The class is actually from a library I'm using and other packages I use depend on that library too. MeteorJS requires packages to specify the exact version and source of their dependencies, which is why I can't use a fork: I would have to fork every package that depends on this library.