私はクラスの機能を上書きしようとしています:はJavaScript:全クラスのコンストラクタで定義されたプロパティを上書き
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()
をしかし、バベルは、これに上記をコンパイル:
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();
関数であるので元のコードのプロパティとして定義されている場合、Babelはその定義をコンストラクタに置きます。 私が正しく理解していれば、プロトタイプには関数のみが含まれていますが、すべてのプロパティは含まれていません。 オブジェクトがプロトタイプから派生した後にコンストラクタが実行されるため、プロトタイプを使用してその関数を上書きすることはできません。
私の2回目の試行は、コンストラクタを上書きした:
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()
まあ、試してみましょう... バベルでコンパイル、test.jsし、実行するためにそれを保存します。
~> node test.js
not this
私がしようとしましたできるだけ一般的な質問をする。特定のケースでクラスを変更できない理由についての背景情報:クラスは実際に私が使用しているライブラリのものであり、使用する他のパッケージもそのライブラリに依存しています。 MeteorJSでは、依存関係の正確なバージョンとソースを指定するパッケージが必要です。そのため、私はフォークを使用できません。このライブラリに依存するすべてのパッケージをforkする必要があります。
この回答は解決策を見つけるのにはあまり役に立ちませんが、問題と構造を理解するうえで最も役立ちます。 解決策として自分の答えを記入することはできないので、問題を理解するのに役立ちましたので、解決策としてマークします。 – PetaByteBoy